Skip to content

Commit 05808ea

Browse files
committed
add xImplementsSkip additional property
1 parent 039606d commit 05808ea

88 files changed

Lines changed: 12751 additions & 44 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
generatorName: spring
2-
outputDir: samples/server/petstore/springboot-skip-x-implements
2+
outputDir: samples/server/petstore/springboot-x-implements-skip
33
inputSpec: modules/openapi-generator/src/test/resources/3_0/spring/petstore-with-fake-endpoints-models-for-testing-x-implements.yaml
44
templateDir: modules/openapi-generator/src/main/resources/JavaSpring
55
additionalProperties:
@@ -9,9 +9,7 @@ additionalProperties:
99
hideGenerationTimestamp: "true"
1010
camelCaseDollarSign: "true"
1111
modelNameSuffix: 'Dto'
12-
xImplementsOverrides:
13-
com.custompackage.InterfaceToSubstitute: com.custompackage.SubstitutedInterface
14-
com.custompackage.InterfaceToSkip: skip
12+
xImplementsSkip: [ com.custompackage.InterfaceToSkip ]
1513
schemaImplements:
16-
Foo: [ com.custompackage.FooInterface, com.custompackage.FooIntergace ]
17-
Animal: [ com.custompackage.AnimalInterfaceImplleeements ]
14+
Foo: [ com.custompackage.WithBar, com.custompackage.WithDefaultMethod ]
15+
Animal: com.custompackage.WithColor

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7140,6 +7140,23 @@ public void setIgnoreFilePathOverride(final String ignoreFileOverride) {
71407140
this.ignoreFilePathOverride = ignoreFileOverride;
71417141
}
71427142

7143+
public List<String> getPropertyAsStringList(String propertyKey) {
7144+
final Object value = additionalProperties.get(propertyKey);
7145+
if (value instanceof List) {
7146+
List<?> list = (List<?>) value;
7147+
List<String> stringList = new ArrayList<>();
7148+
for (Object item : list) {
7149+
if (item != null) {
7150+
stringList.add(item.toString());
7151+
}
7152+
}
7153+
return stringList;
7154+
} else if (value instanceof String) {
7155+
return Collections.singletonList((String) value);
7156+
}
7157+
return Collections.emptyList();
7158+
}
7159+
71437160
public Map<String, String> getPropertyAsStringMap(String propertyKey) {
71447161
final Object value = additionalProperties.get(propertyKey);
71457162
if (value instanceof Map) {

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

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
9292
public static final String BOOLEAN_GETTER_PREFIX = "booleanGetterPrefix";
9393
public static final String IGNORE_ANYOF_IN_ENUM = "ignoreAnyOfInEnum";
9494
public static final String ADDITIONAL_MODEL_TYPE_ANNOTATIONS = "additionalModelTypeAnnotations";
95-
public static final String X_IMPLEMENTS_OVERRIDES = "xImplementsOverrides";
96-
private static final String X_IMPLEMENTS_OVERRIDES_SKIP = "skip";
95+
public static final String X_IMPLEMENTS_SKIP = "xImplementsSkip";
9796
public static final String SCHEMA_IMPLEMENTS = "schemaImplements";
9897
public static final String ADDITIONAL_ONE_OF_TYPE_ANNOTATIONS = "additionalOneOfTypeAnnotations";
9998
public static final String ADDITIONAL_ENUM_TYPE_ANNOTATIONS = "additionalEnumTypeAnnotations";
@@ -185,7 +184,7 @@ protected enum ENUM_PROPERTY_NAMING_TYPE {MACRO_CASE, legacy, original}
185184
protected List<String> additionalModelTypeAnnotations = new LinkedList<>();
186185
@Getter
187186
@Setter
188-
protected Map<String, String> xImplementsOverrides = new HashMap<>();
187+
protected List<String> xImplementsSkip = new ArrayList<>();
189188
@Getter
190189
@Setter
191190
protected Map<String, List<String>> schemaImplements = new HashMap<>();
@@ -349,7 +348,7 @@ public AbstractJavaCodegen() {
349348
cliOptions.add(CliOption.newBoolean(IGNORE_ANYOF_IN_ENUM, "Ignore anyOf keyword in enum", ignoreAnyOfInEnum));
350349
cliOptions.add(CliOption.newString(ADDITIONAL_ENUM_TYPE_ANNOTATIONS, "Additional annotations for enum type(class level annotations)"));
351350
cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)"));
352-
cliOptions.add(CliOption.newString(X_IMPLEMENTS_OVERRIDES, "Ability to exclude or replace interfaces that are specified using x-implements vendor extension. TODO:::"));
351+
cliOptions.add(CliOption.newString(X_IMPLEMENTS_SKIP, "Ability to exclude interfaces that were specified in open api spec using x-implements vendor extension."));
353352
cliOptions.add(CliOption.newString(ADDITIONAL_ONE_OF_TYPE_ANNOTATIONS, "Additional annotations for oneOf interfaces(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)"));
354353
cliOptions.add(CliOption.newBoolean(OPENAPI_NULLABLE, "Enable OpenAPI Jackson Nullable library. Not supported by `microprofile` library.", this.openApiNullable));
355354
cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Skip header parameters in the generated API methods using @ApiImplicitParams annotation.", implicitHeaders));
@@ -460,8 +459,8 @@ public void processOpts() {
460459
convertPropertyToTypeAndWriteBack(ADDITIONAL_ENUM_TYPE_ANNOTATIONS,
461460
annotations -> Arrays.asList(annotations.split(";")),
462461
this::setAdditionalEnumTypeAnnotations);
463-
if (additionalProperties.containsKey(X_IMPLEMENTS_OVERRIDES)) {
464-
this.setXImplementsOverrides(getPropertyAsStringMap(X_IMPLEMENTS_OVERRIDES));
462+
if (additionalProperties.containsKey(X_IMPLEMENTS_SKIP)) {
463+
this.setXImplementsSkip(getPropertyAsStringList(X_IMPLEMENTS_SKIP));
465464
}
466465
if (additionalProperties.containsKey(SCHEMA_IMPLEMENTS)) {
467466
this.setSchemaImplements(getPropertyAsStringListMap(SCHEMA_IMPLEMENTS));
@@ -2015,39 +2014,23 @@ public ModelsMap postProcessModels(ModelsMap objs) {
20152014
}
20162015
}
20172016

2018-
// skip or substitute interfaces predefined in x-implements via xImplementsOverrides
2019-
if (!this.xImplementsOverrides.isEmpty()) {
2020-
List<String> interfacesToSkip = this.xImplementsOverrides.entrySet().stream()
2021-
.filter(entry -> entry.getValue().equals(X_IMPLEMENTS_OVERRIDES_SKIP))
2022-
.map(Map.Entry::getKey)
2023-
.collect(Collectors.toList());
2024-
Map<String, String> interfacesSubstituteFromTo = this.xImplementsOverrides.entrySet().stream()
2025-
.filter(entry -> !entry.getValue().equals(X_IMPLEMENTS_OVERRIDES_SKIP))
2026-
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
2017+
// skip interfaces predefined in open api spec in x-implements via additional property xImplementsSkip
2018+
if (!this.xImplementsSkip.isEmpty()) {
20272019
for (ModelMap mo : objs.getModels()) {
20282020
CodegenModel cm = mo.getModel();
20292021
if (cm.getVendorExtensions().containsKey(X_IMPLEMENTS)) {
20302022
List<String> xImplementsInModelOriginal = (List<String>) cm.getVendorExtensions().get(X_IMPLEMENTS);
20312023
List<String> xImplementsInModelSkipped = xImplementsInModelOriginal
20322024
.stream()
2033-
.filter(interfacesToSkip::contains)
2025+
.filter(o -> this.xImplementsSkip.contains(o))
20342026
.collect(Collectors.toList());
2035-
Map<String, String> xImplementsInModelSubstituteFromTo = interfacesSubstituteFromTo.entrySet().stream()
2036-
.filter(entry -> xImplementsInModelOriginal.contains(entry.getKey()))
2037-
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
20382027
if (!xImplementsInModelSkipped.isEmpty()) {
2039-
LOGGER.info("Following interfaces configured via additional property '{}' will be skipped for model {}: {}", cm.classname, X_IMPLEMENTS_OVERRIDES, xImplementsInModelSkipped);
2040-
}
2041-
if (!xImplementsInModelSubstituteFromTo.isEmpty()) {
2042-
LOGGER.info("Following interfaces configured via additional property '{}' will be replaced for model {}: {}", cm.classname, X_IMPLEMENTS_OVERRIDES, xImplementsInModelSubstituteFromTo.entrySet().stream()
2043-
.map(entry -> " from [" + entry.getKey() + "] to [" + entry.getValue() + "]")
2044-
.collect(Collectors.joining(",")));
2028+
LOGGER.info("Following interfaces configured via additional property '{}' will be skipped for model {}: {}", X_IMPLEMENTS_SKIP, cm.classname, xImplementsInModelSkipped);
20452029
}
20462030
List<String> xImplementsInModelProcessed = xImplementsInModelOriginal.stream()
20472031
.filter(Predicate.not(xImplementsInModelSkipped::contains))
2048-
.map(item -> xImplementsInModelSubstituteFromTo.getOrDefault(item, item))
20492032
.collect(Collectors.toList());
2050-
// implement only the non-filtered-out interfaces and replaced interfaces
2033+
// implement only the non-skipped interfaces
20512034
cm.getVendorExtensions().replace(X_IMPLEMENTS, xImplementsInModelProcessed);
20522035
}
20532036
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -826,24 +826,20 @@ public void testXImplements() throws IOException {
826826

827827
final Map<String, File> files = generateFiles(codegen, "src/test/resources/3_0/spring/petstore-with-fake-endpoints-models-for-testing-x-implements.yaml");
828828
JavaFileAssert.assertThat(files.get("Animal.java"))
829-
.implementsInterfaces("com.custompackage.InterfaceToKeep", "com.custompackage.InterfaceToSkip", "com.custompackage.InterfaceToSubstitute")
830-
.doesNotImplementInterfaces("com.custompackage.SubstitutedInterface");
829+
.implementsInterfaces("com.custompackage.InterfaceToKeep", "com.custompackage.InterfaceToSkip");
831830
}
832831

833832
@Test
834-
public void testXImplementsOverrides() throws IOException {
833+
public void testXImplementsSkip() throws IOException {
835834
final SpringCodegen codegen = new SpringCodegen();
836835

837-
String interfaceToSubstitute = "com.custompackage.InterfaceToSubstitute";
838-
String substitutedInterface = "com.custompackage.SubstitutedInterface";
839836
String interfaceToSkip = "com.custompackage.InterfaceToSkip";
840-
String skipKeyword = "skip";
841-
codegen.additionalProperties().put(X_IMPLEMENTS_OVERRIDES, Map.of(interfaceToSubstitute, substitutedInterface, interfaceToSkip, skipKeyword));
837+
codegen.additionalProperties().put(X_IMPLEMENTS_SKIP, List.of(interfaceToSkip));
842838

843839
final Map<String, File> files = generateFiles(codegen, "src/test/resources/3_0/spring/petstore-with-fake-endpoints-models-for-testing-x-implements.yaml");
844840
JavaFileAssert.assertThat(files.get("Animal.java"))
845-
.implementsInterfaces("com.custompackage.InterfaceToKeep", substitutedInterface)
846-
.doesNotImplementInterfaces(interfaceToSubstitute, interfaceToSkip);
841+
.implementsInterfaces("com.custompackage.InterfaceToKeep")
842+
.doesNotImplementInterfaces(interfaceToSkip);
847843
}
848844

849845
@Test
@@ -859,7 +855,7 @@ public void testSchemaImplements() throws IOException {
859855

860856
final Map<String, File> files = generateFiles(codegen, "src/test/resources/3_0/spring/petstore-with-fake-endpoints-models-for-testing-x-implements.yaml");
861857
JavaFileAssert.assertThat(files.get("Animal.java"))
862-
.implementsInterfaces(anotherInterface, "com.custompackage.InterfaceToSubstitute", "com.custompackage.InterfaceToKeep", "com.custompackage.InterfaceToSkip")
858+
.implementsInterfaces(anotherInterface, "com.custompackage.InterfaceToKeep", "com.custompackage.InterfaceToSkip")
863859
.doesNotImplementInterfaces("com.custompackage.SubstitutedInterface");
864860

865861
JavaFileAssert.assertThat(files.get("Foo.java"))

modules/openapi-generator/src/test/resources/3_0/spring/petstore-with-fake-endpoints-models-for-testing-x-implements.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1576,7 +1576,6 @@ components:
15761576
Animal:
15771577
type: object
15781578
x-implements:
1579-
- com.custompackage.InterfaceToSubstitute
15801579
- com.custompackage.InterfaceToSkip
15811580
- com.custompackage.InterfaceToKeep
15821581
discriminator:
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# OpenAPI Generator Ignore
2+
# Generated by openapi-generator https://github.com/openapitools/openapi-generator
3+
4+
# Use this file to prevent files from being overwritten by the generator.
5+
# The patterns follow closely to .gitignore or .dockerignore.
6+
7+
# As an example, the C# client generator defines ApiClient.cs.
8+
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
9+
#ApiClient.cs
10+
11+
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
12+
#foo/*/qux
13+
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
14+
15+
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
16+
#foo/**/qux
17+
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
18+
19+
# You can also negate patterns with an exclamation (!).
20+
# For example, you can ignore all files in a docs folder with the file extension .md:
21+
#docs/*.md
22+
# Then explicitly reverse the ignore rule for a single file:
23+
#!docs/README.md
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
README.md
2+
pom.xml
3+
src/main/java/org/openapitools/OpenApiGeneratorApplication.java
4+
src/main/java/org/openapitools/RFC3339DateFormat.java
5+
src/main/java/org/openapitools/api/AnotherFakeApi.java
6+
src/main/java/org/openapitools/api/ApiUtil.java
7+
src/main/java/org/openapitools/api/FakeApi.java
8+
src/main/java/org/openapitools/api/FakeClassnameTestApi.java
9+
src/main/java/org/openapitools/api/FooApi.java
10+
src/main/java/org/openapitools/api/PetApi.java
11+
src/main/java/org/openapitools/api/StoreApi.java
12+
src/main/java/org/openapitools/api/UserApi.java
13+
src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java
14+
src/main/java/org/openapitools/configuration/HomeController.java
15+
src/main/java/org/openapitools/configuration/SpringFoxConfiguration.java
16+
src/main/java/org/openapitools/model/AdditionalPropertiesClassDto.java
17+
src/main/java/org/openapitools/model/AllOfWithSingleRefDto.java
18+
src/main/java/org/openapitools/model/AnimalDto.java
19+
src/main/java/org/openapitools/model/ApiResponseDto.java
20+
src/main/java/org/openapitools/model/ArrayOfArrayOfNumberOnlyDto.java
21+
src/main/java/org/openapitools/model/ArrayOfNumberOnlyDto.java
22+
src/main/java/org/openapitools/model/ArrayTestDto.java
23+
src/main/java/org/openapitools/model/CapitalizationDto.java
24+
src/main/java/org/openapitools/model/CatDto.java
25+
src/main/java/org/openapitools/model/CategoryDto.java
26+
src/main/java/org/openapitools/model/ChildWithNullableDto.java
27+
src/main/java/org/openapitools/model/ClassModelDto.java
28+
src/main/java/org/openapitools/model/ClientDto.java
29+
src/main/java/org/openapitools/model/DeprecatedObjectDto.java
30+
src/main/java/org/openapitools/model/DogDto.java
31+
src/main/java/org/openapitools/model/EnumArraysDto.java
32+
src/main/java/org/openapitools/model/EnumClassDto.java
33+
src/main/java/org/openapitools/model/EnumTestDto.java
34+
src/main/java/org/openapitools/model/FakeBigDecimalMap200ResponseDto.java
35+
src/main/java/org/openapitools/model/FileDto.java
36+
src/main/java/org/openapitools/model/FileSchemaTestClassDto.java
37+
src/main/java/org/openapitools/model/FooDto.java
38+
src/main/java/org/openapitools/model/FooGetDefaultResponseDto.java
39+
src/main/java/org/openapitools/model/FormatTestDto.java
40+
src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java
41+
src/main/java/org/openapitools/model/HealthCheckResultDto.java
42+
src/main/java/org/openapitools/model/ListDto.java
43+
src/main/java/org/openapitools/model/MapTestDto.java
44+
src/main/java/org/openapitools/model/MixedPropertiesAndAdditionalPropertiesClassDto.java
45+
src/main/java/org/openapitools/model/Model200ResponseDto.java
46+
src/main/java/org/openapitools/model/NameDto.java
47+
src/main/java/org/openapitools/model/NullableClassDto.java
48+
src/main/java/org/openapitools/model/NumberOnlyDto.java
49+
src/main/java/org/openapitools/model/ObjectWithDeprecatedFieldsDto.java
50+
src/main/java/org/openapitools/model/OrderDto.java
51+
src/main/java/org/openapitools/model/OuterCompositeDto.java
52+
src/main/java/org/openapitools/model/OuterEnumDefaultValueDto.java
53+
src/main/java/org/openapitools/model/OuterEnumDto.java
54+
src/main/java/org/openapitools/model/OuterEnumIntegerDefaultValueDto.java
55+
src/main/java/org/openapitools/model/OuterEnumIntegerDto.java
56+
src/main/java/org/openapitools/model/OuterObjectWithEnumPropertyDto.java
57+
src/main/java/org/openapitools/model/ParentWithNullableDto.java
58+
src/main/java/org/openapitools/model/PetDto.java
59+
src/main/java/org/openapitools/model/ReadOnlyFirstDto.java
60+
src/main/java/org/openapitools/model/ReturnDto.java
61+
src/main/java/org/openapitools/model/SingleRefTypeDto.java
62+
src/main/java/org/openapitools/model/SpecialModelNameDto.java
63+
src/main/java/org/openapitools/model/TagDto.java
64+
src/main/java/org/openapitools/model/TestInlineFreeformAdditionalPropertiesRequestDto.java
65+
src/main/java/org/openapitools/model/UserDto.java
66+
src/main/resources/application.properties
67+
src/main/resources/openapi.yaml
68+
src/main/resources/static/swagger-ui.html
69+
src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7.20.0-SNAPSHOT
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# OpenAPI generated server
2+
3+
Spring Boot Server
4+
5+
## Overview
6+
This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project.
7+
By using the [OpenAPI-Spec](https://openapis.org), you can easily generate a server stub.
8+
This is an example of building a OpenAPI-enabled server in Java using the SpringBoot framework.
9+
10+
The underlying library integrating OpenAPI to Spring Boot is [springfox](https://github.com/springfox/springfox).
11+
Springfox will generate an OpenAPI v2 (fka Swagger RESTful API Documentation Specification) specification based on the
12+
generated Controller and Model classes. The specification is available to download using the following url:
13+
http://localhost:80/v2/api-docs/
14+
15+
**HEADS-UP**: Springfox is deprecated for removal in version 6.0.0 of openapi-generator. The project seems to be no longer
16+
maintained (last commit is of Oct 14, 2020). It works with Spring Boot 2.5.x but not with 2.6. Spring Boot 2.5 is
17+
supported until 2022-05-19. Users of openapi-generator should migrate to the springdoc documentation provider which is,
18+
as an added bonus, OpenAPI v3 compatible.
19+
20+
21+
22+
Start your server as a simple java application
23+
24+
You can view the api documentation in swagger-ui by pointing to
25+
http://localhost:80/swagger-ui.html
26+
27+
Change default port value in application.properties

0 commit comments

Comments
 (0)