Skip to content

Commit f88d791

Browse files
Fix #62 - add filename if using default basePackage (#63)
Signed-off-by: Ricardo Zanini <[email protected]>
1 parent aa86600 commit f88d791

File tree

8 files changed

+43
-40
lines changed

8 files changed

+43
-40
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ To fine tune the configuration for each spec file, add the following entry to yo
5555
quarkus.openapi-generator.codegen.spec.petstore_json.base-package=org.acme.openapi
5656
```
5757

58+
If a base package name is not provided, it will be used the default `org.openapi.quarkus.<filename>`. For example, `org.openapi.quarkus.petstore_json`.
59+
5860
Note that the file name is used to configure the specific information for each spec. We follow the [Environment Variables Mapping Rules](https://github.com/eclipse/microprofile-config/blob/master/spec/src/main/asciidoc/configsources.asciidoc#environment-variables-mapping-rules) from Microprofile Configuration to sanitize the OpenAPI spec filename. Any non-alphabetic characters are replaced by an underscore `_`.
5961

6062
Run `mvn compile` to generate your classes in `target/generated-sources/open-api-json` path:

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static String resolveModelPackage(final String basePackage) {
4242
return String.format("%s%s", basePackage, MODEL_PKG_SUFFIX);
4343
}
4444

45-
public static String getResolvedBasePackagePropertyName(final Path openApiFilePath) {
45+
public static String getBasePackagePropertyName(final Path openApiFilePath) {
4646
return String.format(BASE_PACKAGE_PROP_FORMAT, getBuildTimeSpecPropertyPrefix(openApiFilePath));
4747
}
4848

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package io.quarkiverse.openapi.generator.deployment.codegen;
22

33
import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.VERBOSE_PROPERTY_NAME;
4-
import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.getResolvedBasePackagePropertyName;
4+
import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.getBasePackagePropertyName;
5+
import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.getSanitizedFileName;
56
import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.getSkipFormModelPropertyName;
67

78
import java.io.IOException;
89
import java.nio.file.Files;
910
import java.nio.file.Path;
10-
import java.util.Optional;
1111
import java.util.stream.Stream;
1212

1313
import org.eclipse.microprofile.config.Config;
@@ -30,6 +30,8 @@ public abstract class OpenApiGeneratorCodeGenBase implements CodeGenProvider {
3030
static final String YML = ".yml";
3131
static final String JSON = ".json";
3232

33+
private static final String DEFAULT_PACKAGE = "org.openapi.quarkus";
34+
3335
@Override
3436
public String inputDirectory() {
3537
return "openapi";
@@ -58,22 +60,27 @@ public boolean trigger(CodeGenContext context) throws CodeGenException {
5860
return false;
5961
}
6062

61-
protected void generate(Config config, final Path openApiFilePath, final Path outDir) {
62-
// TODO: do not generate if the output dir has generated files and the openapi file has the same checksum of the previous run
63-
final String basePackage = getResolvedBasePackagePropertyName(openApiFilePath);
64-
final Optional<Boolean> verbose = config.getOptionalValue(VERBOSE_PROPERTY_NAME, Boolean.class);
63+
// TODO: do not generate if the output dir has generated files and the openapi file has the same checksum of the previous run
64+
protected void generate(final Config config, final Path openApiFilePath, final Path outDir) {
65+
final String basePackage = getBasePackage(config, openApiFilePath);
66+
final Boolean verbose = config.getOptionalValue(VERBOSE_PROPERTY_NAME, Boolean.class).orElse(false);
67+
6568
final OpenApiClientGeneratorWrapper generator = new OpenApiClientGeneratorWrapper(
6669
openApiFilePath.normalize(),
6770
outDir,
68-
verbose.orElse(false))
69-
.withModelCodeGenConfiguration(ModelCodegenConfigParser.parse(config, basePackage))
70-
.withCircuitBreakerConfiguration(CircuitBreakerConfigurationParser.parse(
71+
verbose)
72+
.withModelCodeGenConfig(ModelCodegenConfigParser.parse(config, basePackage))
73+
.withCircuitBreakerConfig(CircuitBreakerConfigurationParser.parse(
7174
config));
72-
config.getOptionalValue(basePackage, String.class)
73-
.ifPresent(generator::withBasePackage);
7475
config.getOptionalValue(getSkipFormModelPropertyName(openApiFilePath), String.class)
7576
.ifPresent(generator::withSkipFormModelConfig);
7677

77-
generator.generate();
78+
generator.generate(basePackage);
79+
}
80+
81+
private String getBasePackage(final Config config, final Path openApiFilePath) {
82+
return config
83+
.getOptionalValue(getBasePackagePropertyName(openApiFilePath), String.class)
84+
.orElse(String.format("%s.%s", DEFAULT_PACKAGE, getSanitizedFileName(openApiFilePath)));
7885
}
7986
}

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/SpecInputModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public SpecInputModel(final String filename, final InputStream inputStream) {
3333
*/
3434
public SpecInputModel(final String filename, final InputStream inputStream, final String basePackageName) {
3535
this(filename, inputStream);
36-
this.codegenProperties.put(CodegenConfig.getResolvedBasePackagePropertyName(Path.of(filename)), basePackageName);
36+
this.codegenProperties.put(CodegenConfig.getBasePackagePropertyName(Path.of(filename)), basePackageName);
3737
}
3838

3939
public String getFileName() {

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapper.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.resolveModelPackage;
66
import static java.lang.Boolean.FALSE;
77
import static java.lang.Boolean.TRUE;
8+
import static java.util.Objects.requireNonNull;
89

910
import java.io.File;
1011
import java.nio.file.Path;
@@ -27,12 +28,11 @@ public class OpenApiClientGeneratorWrapper {
2728

2829
public static final String VERBOSE = "verbose";
2930
private static final String ONCE_LOGGER = "org.openapitools.codegen.utils.oncelogger.enabled";
30-
private static final String DEFAULT_PACKAGE = "org.openapi.quarkus";
3131

3232
private final QuarkusCodegenConfigurator configurator;
3333
private final DefaultGenerator generator;
3434

35-
private String basePackage = DEFAULT_PACKAGE;
35+
private String basePackage = "";
3636
private String apiPackage = "";
3737
private String modelPackage = "";
3838

@@ -68,25 +68,20 @@ public OpenApiClientGeneratorWrapper withModelPackage(final String pkg) {
6868
return this;
6969
}
7070

71-
public OpenApiClientGeneratorWrapper withBasePackage(final String pkg) {
72-
this.basePackage = pkg;
73-
return this;
74-
}
75-
7671
/**
7772
* Adds the circuit breaker configuration to the generator.
7873
*
7974
* @param config a map of class names and their methods that should be configured with circuit breaker
8075
* @return this wrapper
8176
*/
82-
public OpenApiClientGeneratorWrapper withCircuitBreakerConfiguration(final Map<String, List<String>> config) {
77+
public OpenApiClientGeneratorWrapper withCircuitBreakerConfig(final Map<String, List<String>> config) {
8378
if (config != null) {
8479
configurator.addAdditionalProperty("circuit-breaker", config);
8580
}
8681
return this;
8782
}
8883

89-
public OpenApiClientGeneratorWrapper withModelCodeGenConfiguration(final Map<String, Object> config) {
84+
public OpenApiClientGeneratorWrapper withModelCodeGenConfig(final Map<String, Object> config) {
9085
if (config != null) {
9186
configurator.addAdditionalProperty("model-codegen", config);
9287
}
@@ -104,14 +99,16 @@ public OpenApiClientGeneratorWrapper withSkipFormModelConfig(final String skipFo
10499
return this;
105100
}
106101

107-
public List<File> generate() {
102+
public List<File> generate(final String basePackage) {
103+
this.basePackage = basePackage;
108104
this.consolidatePackageNames();
109105
return generator.opts(configurator.toClientOptInput()).generate();
110106
}
111107

112108
private void consolidatePackageNames() {
109+
requireNonNull(basePackage);
113110
if (basePackage.isEmpty()) {
114-
basePackage = DEFAULT_PACKAGE;
111+
throw new IllegalArgumentException("basePackage must be a non-empty String");
115112
}
116113
if (apiPackage.isEmpty()) {
117114
this.apiPackage = resolveApiPackage(basePackage);

deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapperTest.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,27 @@ public class OpenApiClientGeneratorWrapperTest {
3434

3535
@Test
3636
void verifyCommonGenerated() throws URISyntaxException {
37-
final List<File> generatedFiles = createGeneratorWrapper("petstore-openapi.json").generate();
37+
final List<File> generatedFiles = createGeneratorWrapper("petstore-openapi.json").generate("org.petstore");
3838
assertNotNull(generatedFiles);
3939
assertFalse(generatedFiles.isEmpty());
4040
}
4141

4242
@Test
4343
void verifyAuthBasicGenerated() throws URISyntaxException {
44-
final List<File> generatedFiles = createGeneratorWrapper("petstore-openapi-httpbasic.json").generate();
44+
final List<File> generatedFiles = createGeneratorWrapper("petstore-openapi-httpbasic.json").generate("org.petstore");
4545
assertTrue(generatedFiles.stream().anyMatch(f -> f.getName().equals("CompositeAuthenticationProvider.java")));
4646
}
4747

4848
@Test
4949
void verifyAuthBearerGenerated() throws URISyntaxException {
50-
final List<File> generatedFiles = createGeneratorWrapper("petstore-openapi-bearer.json").generate();
50+
final List<File> generatedFiles = createGeneratorWrapper("petstore-openapi-bearer.json").generate("org.petstore");
5151
assertTrue(generatedFiles.stream().anyMatch(f -> f.getName().equals("CompositeAuthenticationProvider.java")));
5252
}
5353

5454
@Test
5555
void verifyEnumGeneration() throws URISyntaxException, FileNotFoundException {
5656
final List<File> generatedFiles = createGeneratorWrapper("issue-28.yaml")
57-
.withBasePackage("org.issue28")
58-
.generate();
57+
.generate("org.issue28");
5958
final Optional<File> enumFile = generatedFiles.stream()
6059
.filter(f -> f.getName().endsWith("ConnectorNamespaceState.java")).findFirst();
6160
assertThat(enumFile).isPresent();
@@ -73,9 +72,8 @@ void verifyDeprecatedFields() throws URISyntaxException, FileNotFoundException {
7372
final Map<String, Object> codegenConfig = ModelCodegenConfigParser
7473
.parse(MockConfigUtils.getTestConfig("/codegen/application.properties"), "org.issue38");
7574
final List<File> generatedFiles = this.createGeneratorWrapper("issue-38.yaml")
76-
.withBasePackage("org.issue38")
77-
.withModelCodeGenConfiguration(codegenConfig)
78-
.generate();
75+
.withModelCodeGenConfig(codegenConfig)
76+
.generate("org.issue38");
7977

8078
// we have two attributes that will be generated with the same name, one of them is deprecated
8179
final Optional<File> metaV1Condition = generatedFiles.stream()
@@ -158,7 +156,7 @@ void checkAnnotations() throws URISyntaxException, FileNotFoundException {
158156
void verifyMultipartFormAnnotationIsGeneratedForParameter() throws URISyntaxException, FileNotFoundException {
159157
List<File> generatedFiles = createGeneratorWrapper("multipart-openapi.yml")
160158
.withSkipFormModelConfig("false")
161-
.generate();
159+
.generate("org.acme");
162160
assertThat(generatedFiles).isNotEmpty();
163161

164162
Optional<File> file = generatedFiles.stream()
@@ -186,7 +184,7 @@ void verifyMultipartFormAnnotationIsGeneratedForParameter() throws URISyntaxExce
186184
void verifyMultipartPojoGeneratedAndFieldsHaveAnnotations() throws URISyntaxException, FileNotFoundException {
187185
List<File> generatedFiles = createGeneratorWrapper("multipart-openapi.yml")
188186
.withSkipFormModelConfig("false")
189-
.generate();
187+
.generate("org.acme");
190188
assertFalse(generatedFiles.isEmpty());
191189

192190
Optional<File> file = generatedFiles.stream()
@@ -210,10 +208,10 @@ void verifyMultipartPojoGeneratedAndFieldsHaveAnnotations() throws URISyntaxExce
210208

211209
private List<File> generateRestClientFiles() throws URISyntaxException {
212210
OpenApiClientGeneratorWrapper generatorWrapper = createGeneratorWrapper("simple-openapi.json")
213-
.withCircuitBreakerConfiguration(Map.of(
211+
.withCircuitBreakerConfig(Map.of(
214212
"org.openapitools.client.api.DefaultApi", List.of("opThatDoesNotExist", "byeGet")));
215213

216-
return generatorWrapper.generate();
214+
return generatorWrapper.generate("org.openapitools.client");
217215
}
218216

219217
private OpenApiClientGeneratorWrapper createGeneratorWrapper(String specFileName) throws URISyntaxException {

integration-tests/example-project/src/main/resources/application.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ quarkus.openapi-generator.codegen.spec.open_weather_yaml.base-package=org.acme.o
88
# Authentication properties
99
org.acme.openapi.weather.security.auth.app_id/api-key=12345
1010

11-
quarkus.openapi-generator.codegen.spec.simple_openapi_json.base-package=org.acme.openapi.simple
1211

1312
org.acme.openapi.simple.api.DefaultApi/byeGet/CircuitBreaker/enabled=true
1413
org.acme.openapi.simple.api.DefaultApi/byeGet/CircuitBreaker/failOn = java.lang.IllegalArgumentException,java.lang.NullPointerException

integration-tests/example-project/src/test/java/io/quarkiverse/openapi/generator/it/SimpleOpenApiTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ class SimpleOpenApiTest {
2121

2222
@Test
2323
void circuitBreaker() throws IOException {
24-
Path generatedRestClient = Paths.get("target", "generated-sources", "open-api-json", "org", "acme",
25-
"openapi", "simple", "api", "DefaultApi.java");
24+
Path generatedRestClient = Paths.get("target", "generated-sources", "open-api-json", "org", "openapi",
25+
"quarkus", "simple_openapi_json", "api", "DefaultApi.java");
2626

2727
assertThat(generatedRestClient)
2828
.exists()

0 commit comments

Comments
 (0)