Skip to content

Commit 1597304

Browse files
committed
add xKotlinImplementsSkip and xKotlinImplementsFieldsSkip additional properties
1 parent 05808ea commit 1597304

3 files changed

Lines changed: 44 additions & 6 deletions

File tree

bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@ additionalProperties:
2121
Pet: id
2222
Category: [ name, id ]
2323
Dog: [ bark, breed ]
24+
xKotlinImplementsSkip: [ com.some.pack.WithPhotoUrls ]
25+
xKotlinImplementsFieldsSkip:
26+
Pet: [ photoUrls ]

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -509,8 +509,8 @@ components:
509509
mapping:
510510
Dog: '#/components/schemas/Dog'
511511
Cat: '#/components/schemas/Cat'
512-
x-kotlin-implements: [ com.some.pack.Named, com.some.pack.WithCategory, com.some.pack.WithDefaultMethods ]
513-
x-kotlin-implements-fields: [ name, category ]
512+
x-kotlin-implements: [ com.some.pack.Named, com.some.pack.WithPhotoUrls, com.some.pack.WithCategory, com.some.pack.WithDefaultMethods ]
513+
x-kotlin-implements-fields: [ name, category, photoUrls ]
514514
required:
515515
- name
516516
- photoUrls

0 commit comments

Comments
 (0)