@@ -648,38 +648,40 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
648648 }
649649
650650 private void postProcessPolymorphism (final List <ModelMap > allModels ) {
651- final HashMap <String , List <String >> discriminatorsForModel = new HashMap <>();
651+ final HashMap <String , List <CodegenDiscriminator >> discriminatorsForModel = new HashMap <>();
652652
653653 for (final ModelMap mo : allModels ) {
654654 final CodegenModel cm = mo .getModel ();
655655
656656 final CodegenComposedSchemas cs = cm .getComposedSchemas ();
657657 if (cs != null ) {
658658 final List <CodegenProperty > csOneOf = cs .getOneOf ();
659+ CodegenDiscriminator discriminator = cm .getDiscriminator ();
660+
659661 if (csOneOf != null ) {
660- processPolymorphismDataType (csOneOf );
662+ processPolymorphismDataType (csOneOf , discriminator );
661663 cs .setOneOf (csOneOf );
662664 cm .setComposedSchemas (cs );
663665 }
664666
665667 final List <CodegenProperty > csAnyOf = cs .getAnyOf ();
666668 if (csAnyOf != null ) {
667- processPolymorphismDataType (csAnyOf );
669+ processPolymorphismDataType (csAnyOf , discriminator );
668670 cs .setAnyOf (csAnyOf );
669671 cm .setComposedSchemas (cs );
670672 }
671673 }
672674
673675 if (cm .discriminator != null ) {
674676 for (final String model : cm .oneOf ) {
675- final List <String > discriminators = discriminatorsForModel .getOrDefault (model , new ArrayList <>());
676- discriminators .add (cm .discriminator . getPropertyName () );
677+ final List <CodegenDiscriminator > discriminators = discriminatorsForModel .getOrDefault (model , new ArrayList <>());
678+ discriminators .add (cm .discriminator );
677679 discriminatorsForModel .put (model , discriminators );
678680 }
679681
680682 for (final String model : cm .anyOf ) {
681- final List <String > discriminators = discriminatorsForModel .getOrDefault (model , new ArrayList <>());
682- discriminators .add (cm .discriminator . getPropertyName () );
683+ final List <CodegenDiscriminator > discriminators = discriminatorsForModel .getOrDefault (model , new ArrayList <>());
684+ discriminators .add (cm .discriminator );
683685 discriminatorsForModel .put (model , discriminators );
684686 }
685687 }
@@ -689,11 +691,11 @@ private void postProcessPolymorphism(final List<ModelMap> allModels) {
689691 for (ModelMap mo : allModels ) {
690692 final CodegenModel cm = mo .getModel ();
691693
692- final List <String > discriminators = discriminatorsForModel .get (cm .getSchemaName ());
694+ final List <CodegenDiscriminator > discriminators = discriminatorsForModel .get (cm .getSchemaName ());
693695 if (discriminators != null ) {
694696 // If the discriminator field is not a defined attribute in the variant structure, create it.
695697 if (!discriminating (discriminators , cm )) {
696- final String discriminator = discriminators .get (0 );
698+ final CodegenDiscriminator discriminator = discriminators .get (0 );
697699
698700 CodegenProperty property = new CodegenProperty ();
699701
@@ -710,17 +712,18 @@ private void postProcessPolymorphism(final List<ModelMap> allModels) {
710712 property .isDiscriminator = true ;
711713
712714 // Attributes based on the discriminator value
713- property .baseName = discriminator ;
714- property .name = discriminator ;
715- property .nameInCamelCase = camelize (discriminator );
715+ property .baseName = discriminator . getPropertyBaseName () ;
716+ property .name = discriminator . getPropertyName () ;
717+ property .nameInCamelCase = camelize (discriminator . getPropertyName () );
716718 property .nameInPascalCase = property .nameInCamelCase .substring (0 , 1 ).toUpperCase (Locale .ROOT ) + property .nameInCamelCase .substring (1 );
717- property .nameInSnakeCase = underscore (discriminator ).toUpperCase (Locale .ROOT );
719+ property .nameInSnakeCase = underscore (discriminator . getPropertyName () ).toUpperCase (Locale .ROOT );
718720 property .getter = String .format (Locale .ROOT , "get%s" , property .nameInPascalCase );
719721 property .setter = String .format (Locale .ROOT , "set%s" , property .nameInPascalCase );
720722 property .defaultValueWithParam = String .format (Locale .ROOT , " = data.%s;" , property .name );
721723
722724 // Attributes based on the model name
723725 property .defaultValue = String .format (Locale .ROOT , "r#\" %s\" #.to_string()" , cm .getSchemaName ());
726+ property .discriminatorValue = getDiscriminatorValue (cm .getClassname (), discriminator );
724727 property .jsonSchema = String .format (Locale .ROOT , "{ \" default\" :\" %s\" ; \" type\" :\" string\" }" , cm .getSchemaName ());
725728
726729 cm .vars .add (property );
@@ -743,14 +746,27 @@ private void postProcessPolymorphism(final List<ModelMap> allModels) {
743746 }
744747 }
745748
746- private static boolean discriminating (final List <String > discriminatorsForModel , final CodegenModel cm ) {
749+ private static String getDiscriminatorValue (String modelName , CodegenDiscriminator discriminator ) {
750+ if (discriminator == null || discriminator .getMappedModels () == null ) {
751+ return modelName ;
752+ }
753+ return discriminator
754+ .getMappedModels ()
755+ .stream ()
756+ .filter (m -> m .getModelName ().equals (modelName ) && m .getMappingName () != null )
757+ .map (CodegenDiscriminator .MappedModel ::getMappingName )
758+ .findFirst ()
759+ .orElse (modelName );
760+ }
761+
762+ private static boolean discriminating (final List <CodegenDiscriminator > discriminatorsForModel , final CodegenModel cm ) {
747763 resetDiscriminatorProperty (cm );
748764
749765 // Discriminator will be presented as enum tag -> One and only one tag is allowed
750766 int countString = 0 ;
751767 int countNonString = 0 ;
752768 for (final CodegenProperty var : cm .vars ) {
753- if (discriminatorsForModel .stream ().anyMatch (discriminator -> var .baseName .equals (discriminator ) || var .name .equals (discriminator ))) {
769+ if (discriminatorsForModel .stream ().anyMatch (discriminator -> var .baseName .equals (discriminator . getPropertyBaseName ()) || var .name .equals (discriminator . getPropertyName () ))) {
754770 if (var .isString ) {
755771 var .isDiscriminator = true ;
756772 ++countString ;
@@ -773,7 +789,7 @@ private static void resetDiscriminatorProperty(final CodegenModel cm) {
773789 }
774790 }
775791
776- private static void processPolymorphismDataType (final List <CodegenProperty > cp ) {
792+ private static void processPolymorphismDataType (final List <CodegenProperty > cp , CodegenDiscriminator discriminator ) {
777793 final HashSet <String > dedupDataTypeWithEnum = new HashSet <>();
778794 final HashMap <String , Integer > dedupDataType = new HashMap <>();
779795
@@ -783,6 +799,7 @@ private static void processPolymorphismDataType(final List<CodegenProperty> cp)
783799 // Mainly needed for primitive types.
784800 model .datatypeWithEnum = camelize (model .dataType .replaceAll ("(?:\\ w+::)+(\\ w+)" , "$1" )
785801 .replace ("<" , "Of" ).replace (">" , "" )).replace (" " , "" ).replace ("," , "" );
802+ model .discriminatorValue = getDiscriminatorValue (model .datatypeWithEnum , discriminator );
786803 if (!dedupDataTypeWithEnum .add (model .datatypeWithEnum )) {
787804 model .datatypeWithEnum += ++idx ;
788805 }
0 commit comments