@@ -58,6 +58,8 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
5858 public static final String USE_JAKARTA_EE = "useJakartaEe" ;
5959 public static final String SCHEMA_IMPLEMENTS = "schemaImplements" ;
6060 public static final String SCHEMA_IMPLEMENTS_FIELDS = "schemaImplementsFields" ;
61+ public static final String X_KOTLIN_IMPLEMENTS_SKIP = "xKotlinImplementsSkip" ;
62+ public static final String X_KOTLIN_IMPLEMENTS_FIELDS_SKIP = "xKotlinImplementsFieldsSkip" ;
6163
6264 private final Logger LOGGER = LoggerFactory .getLogger (AbstractKotlinCodegen .class );
6365
@@ -96,6 +98,12 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
9698 @ Getter
9799 @ Setter
98100 protected Map <String , List <String >> schemaImplementsFields = new HashMap <>();
101+ @ Getter
102+ @ Setter
103+ protected List <String > xKotlinImplementsSkip = new ArrayList <>();
104+ @ Getter
105+ @ Setter
106+ protected Map <String , List <String >> xKotlinImplementsFieldsSkip = new HashMap <>();
99107
100108 public AbstractKotlinCodegen () {
101109 super ();
@@ -529,6 +537,12 @@ public void processOpts() {
529537 if (additionalProperties .containsKey (SCHEMA_IMPLEMENTS_FIELDS )) {
530538 this .setSchemaImplementsFields (getPropertyAsStringListMap (SCHEMA_IMPLEMENTS_FIELDS ));
531539 }
540+ if (additionalProperties .containsKey (X_KOTLIN_IMPLEMENTS_SKIP )) {
541+ this .setXKotlinImplementsSkip (getPropertyAsStringList (X_KOTLIN_IMPLEMENTS_SKIP ));
542+ }
543+ if (additionalProperties .containsKey (X_KOTLIN_IMPLEMENTS_FIELDS_SKIP )) {
544+ this .setXKotlinImplementsFieldsSkip (getPropertyAsStringListMap (X_KOTLIN_IMPLEMENTS_FIELDS_SKIP ));
545+ }
532546
533547 additionalProperties .put (CodegenConstants .SORT_PARAMS_BY_REQUIRED_FLAG , getSortParamsByRequiredFlag ());
534548 additionalProperties .put (CodegenConstants .SORT_MODEL_PROPERTIES_BY_REQUIRED_FLAG , getSortModelPropertiesByRequiredFlag ());
@@ -857,27 +871,48 @@ public CodegenModel fromModel(String name, Schema schema) {
857871 List <String > schemaImplementedInterfacesClasses = this .getSchemaImplements ().getOrDefault (m .getSchemaName (), List .of ());
858872 List <String > schemaImplementedInterfacesFields = this .getSchemaImplementsFields ().getOrDefault (m .getSchemaName (), List .of ());
859873 List <String > vendorExtensionImplementedInterfacesClasses = (List <String >) m .getVendorExtensions ().get (VendorExtension .X_KOTLIN_IMPLEMENTS .getName ());
874+ List <String > interfacesToSkip = this .getXKotlinImplementsSkip ().stream ()
875+ .filter (vendorExtensionImplementedInterfacesClasses ::contains )
876+ .collect (Collectors .toList ());
877+ if (!interfacesToSkip .isEmpty ()) {
878+ LOGGER .info ("Interface(s) {} in model {} are skipped from being marked as implemented via additional property '{}'." ,
879+ interfacesToSkip , name , X_KOTLIN_IMPLEMENTS_SKIP );
880+ }
881+ List <String > vendorExtensionImplementedInterfacesClassesFiltered = vendorExtensionImplementedInterfacesClasses .stream ()
882+ .filter (interfaceName -> !interfacesToSkip .contains (interfaceName ))
883+ .collect (Collectors .toList ());
860884 List <String > vendorExtensionImplementedInterfacesFields = Optional .ofNullable ((List <String >) m .getVendorExtensions ().get (VendorExtension .X_KOTLIN_IMPLEMENTS_FIELDS .getName ()))
861885 .map (xKotlinImplementsFields -> {
862- if (vendorExtensionImplementedInterfacesClasses .isEmpty () && !xKotlinImplementsFields .isEmpty ()) {
886+ if (vendorExtensionImplementedInterfacesClassesFiltered .isEmpty () && !xKotlinImplementsFields .isEmpty ()) {
863887 LOGGER .warn ("Annotating {} with {} without {} is not supported. {} will be ignored." ,
864888 name , VendorExtension .X_KOTLIN_IMPLEMENTS_FIELDS .getName (), VendorExtension .X_KOTLIN_IMPLEMENTS .getName (),
865889 VendorExtension .X_KOTLIN_IMPLEMENTS_FIELDS .getName ());
866890 }
867891 return xKotlinImplementsFields ;
868892 }).orElse (List .of ());
869- List <String > combinedImplementedInterfacesClasses = Stream .concat (vendorExtensionImplementedInterfacesClasses .stream (), schemaImplementedInterfacesClasses .stream ())
893+ List <String > fieldsToSkip = this .getXKotlinImplementsFieldsSkip ().getOrDefault (m .getSchemaName (), List .of ())
894+ .stream ()
895+ .filter (vendorExtensionImplementedInterfacesFields ::contains )
896+ .collect (Collectors .toList ());
897+ if (!fieldsToSkip .isEmpty ()) {
898+ LOGGER .info ("Field(s) {} in model {} are skipped from being marked as inherited via additional property '{}'." ,
899+ fieldsToSkip , name , X_KOTLIN_IMPLEMENTS_FIELDS_SKIP );
900+ }
901+ List <String > vendorExtensionImplementedInterfacesFieldsFiltered = vendorExtensionImplementedInterfacesFields .stream ()
902+ .filter (interfaceName -> !fieldsToSkip .contains (interfaceName ))
903+ .collect (Collectors .toList ());
904+ List <String > combinedImplementedInterfacesClasses = Stream .concat (vendorExtensionImplementedInterfacesClassesFiltered .stream (), schemaImplementedInterfacesClasses .stream ())
870905 .distinct ()
871906 .sorted ()
872907 .collect (Collectors .toList ());
873- List <String > combinedImplementedInterfacesFields = Stream .concat (vendorExtensionImplementedInterfacesFields .stream (), schemaImplementedInterfacesFields .stream ())
908+ List <String > combinedImplementedInterfacesFields = Stream .concat (vendorExtensionImplementedInterfacesFieldsFiltered .stream (), schemaImplementedInterfacesFields .stream ())
874909 .distinct ()
875910 .collect (Collectors .toList ());
876911 if (serializableModel && !combinedImplementedInterfacesClasses .contains ("java.io.Serializable" )) {
877912 combinedImplementedInterfacesClasses .add ("java.io.Serializable" );
878913 }
879914 m .getVendorExtensions ().replace (VendorExtension .X_KOTLIN_IMPLEMENTS .getName (), combinedImplementedInterfacesClasses );
880- LOGGER .info ("Model {} implements interfaces : {}" , name , combinedImplementedInterfacesClasses );
915+ LOGGER .info ("Model {} implements interface(s) : {}" , name , combinedImplementedInterfacesClasses );
881916 m .optionalVars = m .optionalVars .stream ().distinct ().collect (Collectors .toList ());
882917 // Update allVars/requiredVars/optionalVars with isInherited
883918 // Each of these lists contains elements that are similar, but they are all cloned
0 commit comments