@@ -3270,11 +3270,11 @@ private CodegenProperty discriminatorFound(String composedSchemaName, Schema sc,
32703270 * @param sc The Schema that may contain the discriminator
32713271 * @param visitedSchemas An array list of visited schemas
32723272 */
3273- private DiscriminatorAndReferenceSchema recursiveGetDiscriminator (Schema sc , ArrayList <Schema > visitedSchemas ) {
3273+ private Discriminator recursiveGetDiscriminator (Schema sc , ArrayList <Schema > visitedSchemas ) {
32743274 Schema refSchema = ModelUtils .getReferencedSchema (openAPI , sc );
3275- Discriminator foundRefDisc = refSchema .getDiscriminator ();
3276- if (foundRefDisc != null ) {
3277- return new DiscriminatorAndReferenceSchema ( foundRefDisc , refSchema ) ;
3275+ Discriminator foundDisc = refSchema .getDiscriminator ();
3276+ if (foundDisc != null ) {
3277+ return foundDisc ;
32783278 }
32793279
32803280 if (this .getLegacyDiscriminatorBehavior ()) {
@@ -3288,15 +3288,17 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
32883288 }
32893289 visitedSchemas .add (refSchema );
32903290
3291+ Discriminator disc = new Discriminator ();
32913292 if (ModelUtils .isComposedSchema (refSchema )) {
32923293 Schema composedSchema = refSchema ;
32933294 if (composedSchema .getAllOf () != null ) {
32943295 // If our discriminator is in one of the allOf schemas break when we find it
32953296 for (Object allOf : composedSchema .getAllOf ()) {
3296- DiscriminatorAndReferenceSchema foundDisc =
3297- recursiveGetDiscriminator ((Schema ) allOf , visitedSchemas );
3297+ foundDisc = recursiveGetDiscriminator ((Schema ) allOf , visitedSchemas );
32983298 if (foundDisc != null ) {
3299- return foundDisc ;
3299+ disc .setPropertyName (foundDisc .getPropertyName ());
3300+ disc .setMapping (foundDisc .getMapping ());
3301+ return disc ;
33003302 }
33013303 }
33023304 }
@@ -3305,7 +3307,6 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
33053307 Integer hasDiscriminatorCnt = 0 ;
33063308 Integer hasNullTypeCnt = 0 ;
33073309 Set <String > discriminatorsPropNames = new HashSet <>();
3308- DiscriminatorAndReferenceSchema foundDisc = null ;
33093310 for (Object oneOf : composedSchema .getOneOf ()) {
33103311 if (ModelUtils .isNullType ((Schema ) oneOf )) {
33113312 // The null type does not have a discriminator. Skip.
@@ -3314,7 +3315,7 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
33143315 }
33153316 foundDisc = recursiveGetDiscriminator ((Schema ) oneOf , visitedSchemas );
33163317 if (foundDisc != null ) {
3317- discriminatorsPropNames .add (foundDisc .discriminator . getPropertyName ());
3318+ discriminatorsPropNames .add (foundDisc .getPropertyName ());
33183319 hasDiscriminatorCnt ++;
33193320 }
33203321 }
@@ -3323,7 +3324,9 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
33233324 "oneOf schemas must have the same property name, but found " + String .join (", " , discriminatorsPropNames ));
33243325 }
33253326 if (foundDisc != null && (hasDiscriminatorCnt + hasNullTypeCnt ) == composedSchema .getOneOf ().size () && discriminatorsPropNames .size () == 1 ) {
3326- return foundDisc ;
3327+ disc .setPropertyName (foundDisc .getPropertyName ());
3328+ disc .setMapping (foundDisc .getMapping ());
3329+ return disc ;
33273330 }
33283331 // If the scenario when oneOf has two children and one of them is the 'null' type,
33293332 // there is no need for a discriminator.
@@ -3333,7 +3336,6 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
33333336 Integer hasDiscriminatorCnt = 0 ;
33343337 Integer hasNullTypeCnt = 0 ;
33353338 Set <String > discriminatorsPropNames = new HashSet <>();
3336- DiscriminatorAndReferenceSchema foundDisc = null ;
33373339 for (Object anyOf : composedSchema .getAnyOf ()) {
33383340 if (ModelUtils .isNullType ((Schema ) anyOf )) {
33393341 // The null type does not have a discriminator. Skip.
@@ -3342,7 +3344,7 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
33423344 }
33433345 foundDisc = recursiveGetDiscriminator ((Schema ) anyOf , visitedSchemas );
33443346 if (foundDisc != null ) {
3345- discriminatorsPropNames .add (foundDisc .discriminator . getPropertyName ());
3347+ discriminatorsPropNames .add (foundDisc .getPropertyName ());
33463348 hasDiscriminatorCnt ++;
33473349 }
33483350 }
@@ -3351,7 +3353,9 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
33513353 "anyOf schemas must have the same property name, but found " + String .join (", " , discriminatorsPropNames ));
33523354 }
33533355 if (foundDisc != null && (hasDiscriminatorCnt + hasNullTypeCnt ) == composedSchema .getAnyOf ().size () && discriminatorsPropNames .size () == 1 ) {
3354- return foundDisc ;
3356+ disc .setPropertyName (foundDisc .getPropertyName ());
3357+ disc .setMapping (foundDisc .getMapping ());
3358+ return disc ;
33553359 }
33563360 // If the scenario when anyOf has two children and one of them is the 'null' type,
33573361 // there is no need for a discriminator.
@@ -3360,16 +3364,6 @@ private DiscriminatorAndReferenceSchema recursiveGetDiscriminator(Schema sc, Arr
33603364 return null ;
33613365 }
33623366
3363- private static class DiscriminatorAndReferenceSchema {
3364- private final Discriminator discriminator ;
3365- private final Schema referenceSchema ;
3366-
3367- private DiscriminatorAndReferenceSchema (Discriminator discriminator , Schema referenceSchema ) {
3368- this .discriminator = discriminator ;
3369- this .referenceSchema = referenceSchema ;
3370- }
3371- }
3372-
33733367 /**
33743368 * This function is only used for composed schemas which have a discriminator
33753369 * Process oneOf and anyOf models in a composed schema and adds them into
@@ -3503,12 +3497,10 @@ protected List<MappedModel> getAllOfDescendants(String thisSchemaName) {
35033497 }
35043498
35053499 protected CodegenDiscriminator createDiscriminator (String schemaName , Schema schema ) {
3506- DiscriminatorAndReferenceSchema discriminatorAndReferenceSchema =
3507- recursiveGetDiscriminator (schema , new ArrayList <Schema >());
3508- if (discriminatorAndReferenceSchema == null ) {
3500+ Discriminator sourceDiscriminator = recursiveGetDiscriminator (schema , new ArrayList <Schema >());
3501+ if (sourceDiscriminator == null ) {
35093502 return null ;
35103503 }
3511- Discriminator sourceDiscriminator = discriminatorAndReferenceSchema .discriminator ;
35123504 CodegenDiscriminator discriminator = new CodegenDiscriminator ();
35133505 String discriminatorPropertyName = sourceDiscriminator .getPropertyName ();
35143506 discriminator .setPropertyName (toVarName (discriminatorPropertyName ));
@@ -3531,21 +3523,6 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch
35313523 .orElseGet (() -> typeMapping .get ("string" ));
35323524 discriminator .setPropertyType (propertyType );
35333525
3534- // check to see if the discriminator property is an enum string
3535- // If it is not in the schema it should be in the reference schema of sourceDiscriminator.
3536- for (Schema s : List .of (schema , discriminatorAndReferenceSchema .referenceSchema )) {
3537- Optional <Schema > discriminatorSchema = Optional .ofNullable (s .getProperties ()).map (p -> (Schema ) p .get (discriminatorPropertyName ));
3538- if (discriminatorSchema .isPresent ()) {
3539- Optional <Schema > refSchema = Optional .ofNullable (discriminatorSchema .get ().get$ref ())
3540- .map (ModelUtils ::getSimpleRef )
3541- .map (n -> ModelUtils .getSchema (openAPI , n ));
3542- Schema correctSchema = refSchema .orElse (discriminatorSchema .get ());
3543- if (correctSchema instanceof StringSchema && correctSchema .getEnum () != null && !correctSchema .getEnum ().isEmpty ()) {
3544- discriminator .setIsEnum (true );
3545- }
3546- }
3547- }
3548-
35493526 discriminator .setMapping (sourceDiscriminator .getMapping ());
35503527 List <MappedModel > uniqueDescendants = new ArrayList <>();
35513528 if (sourceDiscriminator .getMapping () != null && !sourceDiscriminator .getMapping ().isEmpty ()) {
@@ -3597,6 +3574,32 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch
35973574 }
35983575 discriminator .getMappedModels ().addAll (uniqueDescendants );
35993576
3577+ // check current schema, all parents and descendants to see if the discriminator property is an enum string
3578+ List <Schema > schemasToCheckForEnumDiscriminator = new ArrayList <>();
3579+ schemasToCheckForEnumDiscriminator .add (schema );
3580+ if (ModelUtils .isComposedSchema (schema )) {
3581+ ModelUtils .getAllParentsName (schema , openAPI .getComponents ().getSchemas (), true ).stream ()
3582+ .map (n -> ModelUtils .getSchema (openAPI , n ))
3583+ .forEach (schemasToCheckForEnumDiscriminator ::add );
3584+ }
3585+ uniqueDescendants .stream ().map (MappedModel ::getModelName )
3586+ .map (n ->ModelUtils .getSchema (openAPI , n ))
3587+ .forEach (schemasToCheckForEnumDiscriminator ::add );
3588+ for (Schema schemaToCheck : schemasToCheckForEnumDiscriminator ) {
3589+ if (schemaToCheck == null ) {
3590+ continue ;
3591+ }
3592+ boolean hasDiscriminatorEnum = Optional .ofNullable (schemaToCheck .getProperties ())
3593+ .map (p -> (Schema ) p .get (discriminatorPropertyName ))
3594+ .map (s -> ModelUtils .getReferencedSchema (openAPI , s ))
3595+ .filter (s -> s instanceof StringSchema && s .getEnum () != null && !s .getEnum ().isEmpty ())
3596+ .isPresent ();
3597+ if (hasDiscriminatorEnum ) {
3598+ discriminator .setIsEnum (true );
3599+ break ;
3600+ }
3601+ }
3602+
36003603 return discriminator ;
36013604 }
36023605
0 commit comments