Skip to content

Commit 7b66616

Browse files
committed
allow different target dir layout with "resources" folder (#176)
1 parent 1ebb927 commit 7b66616

File tree

5 files changed

+112
-15
lines changed

5 files changed

+112
-15
lines changed

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/converter/ApiOptions.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ class ApiOptions: MappingSettings {
2424
*/
2525
var clearTargetDir = true
2626

27+
/**
28+
* the layout of the target dir
29+
*
30+
* classic: targetDir/packages...
31+
* standard: targetDir/java, targetDir/resources
32+
*/
33+
var targetDirLayout: String = "classic"
34+
35+
val standardLayout: Boolean get() = TargetDirLayout.isStandard(targetDirLayout)
36+
2737
/**
2838
* the root package of the generated interfaces/model. The package folder tree will be created
2939
* inside {@link #targetDir}. Interfaces and models will be placed into the "api" and "model"
@@ -33,6 +43,16 @@ class ApiOptions: MappingSettings {
3343
*/
3444
var packageName = "io.openapiprocessor.generated"
3545

46+
var packageNameApi : String = "api"
47+
var packageNameModel: String = "model"
48+
var packageNameSupport: String = "support"
49+
var packageNameValidation: String = "validation"
50+
51+
val packageApi get() = "${packageName}.${packageNameApi}"
52+
val packageModel get() = "${packageName}.${packageNameModel}"
53+
val packageSupport get() = "${packageName}.${packageNameSupport}"
54+
val packageValidation get() = "${packageName}.${packageNameValidation}"
55+
3656
/**
3757
* enable Bean Validation (JSR303) annotations. Default is false (disabled)
3858
*/
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright 2024 https://github.com/openapi-processor/openapi-processor-core
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.converter
7+
8+
enum class TargetDirLayout {
9+
CLASSIC, // targetDir/{packages}
10+
STANDARD; // targetDir/java/{packages}, targetDir/resources
11+
12+
companion object {
13+
fun isStandard(layout: String): Boolean {
14+
return STANDARD.name.lowercase() == layout
15+
}
16+
}
17+
}

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/writer/DefaultWriterFactory.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.openapiprocessor.core.writer
77

88
import io.openapiprocessor.core.converter.ApiOptions
9+
import io.openapiprocessor.core.converter.TargetDirLayout.Companion.isStandard
910
import io.openapiprocessor.core.support.toURI
1011
import io.openapiprocessor.core.writer.java.PathWriter
1112
import org.slf4j.Logger
@@ -22,14 +23,14 @@ import kotlin.io.path.deleteRecursively
2223
/**
2324
* Writer factory for local file system. Must be initialized via [InitWriterTarget].
2425
*/
25-
open class DefaultWriterFactory(val options: ApiOptions): WriterFactory, InitWriterTarget
26-
{
26+
open class DefaultWriterFactory(val options: ApiOptions): WriterFactory, InitWriterTarget {
2727
private var log: Logger = LoggerFactory.getLogger(this.javaClass.name)
2828

29-
private lateinit var paths: Map<String, Path>
29+
private lateinit var packagePaths: Map<String, Path>
30+
private lateinit var resourcesPath: Path
3031

3132
override fun createWriter(packageName: String, className: String): Writer {
32-
return createWriter(paths.getValue(packageName), className)
33+
return createWriter(packagePaths.getValue(packageName), className)
3334
}
3435

3536
private fun createWriter(packagePath: Path, className: String): Writer {
@@ -48,6 +49,7 @@ open class DefaultWriterFactory(val options: ApiOptions): WriterFactory, InitWri
4849
pkgPaths[apiName] = apiPath
4950
log.debug ("initialized target folder: {}", apiPath.toAbsolutePath ().toString ())
5051

52+
// should be dto or resources
5153
val (modelName, modelPath) = initTargetPackage("model")
5254
pkgPaths[modelName] = modelPath
5355
log.debug ("initialized target folder: {}", modelPath.toAbsolutePath ().toString ())
@@ -62,9 +64,14 @@ open class DefaultWriterFactory(val options: ApiOptions): WriterFactory, InitWri
6264
log.debug("initialized target folder: {}", validationPath.toAbsolutePath().toString())
6365
}
6466

67+
if (options.standardLayout) {
68+
resourcesPath = initTargetResources()
69+
log.debug("initialized target folder: {}", resourcesPath.toAbsolutePath().toString())
70+
}
71+
6572
pkgPaths.putAll(initAdditionalPackages(options))
6673

67-
paths = pkgPaths
74+
packagePaths = pkgPaths
6875
}
6976

7077
open fun initAdditionalPackages(options: ApiOptions): Map<String, Path> {
@@ -80,6 +87,14 @@ open class DefaultWriterFactory(val options: ApiOptions): WriterFactory, InitWri
8087
}
8188
}
8289

90+
private fun initTargetResources(): Path {
91+
val items = mutableListOf(options.targetDir, "resources")
92+
val path = items.joinToString("/")
93+
val target = Paths.get (toURI(path))
94+
Files.createDirectories(target)
95+
return target
96+
}
97+
8398
protected fun initTargetPackage(subPackageName: String): Pair<String, Path> {
8499
val rootPackageFolder = options.packageName.replace(".", "/")
85100

@@ -91,8 +106,13 @@ open class DefaultWriterFactory(val options: ApiOptions): WriterFactory, InitWri
91106
}
92107

93108
private fun createTargetPackage(apiPkg: String): Path {
94-
val pkg = listOf(options.targetDir, apiPkg).joinToString("/")
109+
val items = mutableListOf(options.targetDir)
110+
if (isStandard(options.targetDirLayout)) {
111+
items.add("java")
112+
}
113+
items.add(apiPkg)
95114

115+
val pkg = items.joinToString("/")
96116
val target = Paths.get (toURI(pkg))
97117
Files.createDirectories(target)
98118
return target

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/writer/java/ValidationWriter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ class ValidationWriter(
3030
}
3131

3232
private fun createAnnotationWriter(writerFactory: WriterFactory): Writer {
33-
return writerFactory.createWriter("${options.packageName}.validation", "Values")
33+
return writerFactory.createWriter(options.packageValidation, "Values")
3434
}
3535

3636
private fun createValidatorWriter(writerFactory: WriterFactory): Writer {
37-
return writerFactory.createWriter("${options.packageName}.validation", "ValueValidator")
37+
return writerFactory.createWriter(options.packageValidation, "ValueValidator")
3838
}
3939

4040
private fun writeValues(writer: Writer, formatter: SourceFormatter) {

openapi-processor-core/src/test/kotlin/io/openapiprocessor/core/writer/DefaultWriterFactorySpec.kt

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import io.kotest.core.spec.IsolationMode
1010
import io.kotest.core.spec.style.StringSpec
1111
import io.kotest.matchers.shouldBe
1212
import io.openapiprocessor.core.converter.ApiOptions
13+
import io.openapiprocessor.core.converter.TargetDirLayout
1314
import io.openapiprocessor.core.support.text
1415
import io.openapiprocessor.core.tempFolder
1516
import java.io.File
@@ -30,14 +31,40 @@ class DefaultWriterFactorySpec : StringSpec({
3031
options.beanValidation = false
3132
}
3233

33-
"initializes package folders" {
34+
"initializes 'classic' package folders" {
35+
options.targetDir = listOf(target.toString()).joinToString(File.separator)
36+
options.targetDirLayout = TargetDirLayout.CLASSIC.toString().lowercase()
37+
38+
val writerFactory = DefaultWriterFactory(options)
39+
writerFactory.init()
40+
41+
val api = options.getSourceDir("api")
42+
val model = options.getSourceDir("model")
43+
val support = options.getSourceDir("support")
44+
val validation = options.getSourceDir("validation")
45+
46+
Files.exists(api) shouldBe true
47+
Files.isDirectory(api) shouldBe true
48+
Files.exists(model) shouldBe true
49+
Files.isDirectory(model) shouldBe true
50+
Files.exists(support) shouldBe true
51+
Files.isDirectory(support) shouldBe true
52+
Files.exists(validation) shouldBe false
53+
Files.isDirectory(validation) shouldBe false
54+
}
55+
56+
"initializes 'standard' package folders" {
57+
options.targetDir = listOf(target.toString()).joinToString(File.separator)
58+
options.targetDirLayout = TargetDirLayout.STANDARD.toString().lowercase()
59+
3460
val writerFactory = DefaultWriterFactory(options)
3561
writerFactory.init()
3662

3763
val api = options.getSourceDir("api")
3864
val model = options.getSourceDir("model")
3965
val support = options.getSourceDir("support")
4066
val validation = options.getSourceDir("validation")
67+
val resources = options.getResourceDir()
4168

4269
Files.exists(api) shouldBe true
4370
Files.isDirectory(api) shouldBe true
@@ -47,6 +74,8 @@ class DefaultWriterFactorySpec : StringSpec({
4774
Files.isDirectory(support) shouldBe true
4875
Files.exists(validation) shouldBe false
4976
Files.isDirectory(validation) shouldBe false
77+
Files.exists(resources) shouldBe true
78+
Files.isDirectory(resources) shouldBe true
5079
}
5180

5281
"initializes package folders with validation" {
@@ -207,10 +236,21 @@ private fun ApiOptions.getSourcePath(pkg: String, name: String): Path {
207236
}
208237

209238
private fun ApiOptions.getSourceDir(pkg: String): Path {
210-
return Path.of(
211-
listOf(
212-
targetDir,
213-
packageName.replace(".", File.separator),
214-
pkg)
215-
.joinToString(File.separator))
239+
val items = mutableListOf(targetDir)
240+
if (TargetDirLayout.isStandard(targetDirLayout)) {
241+
items.add("java")
242+
}
243+
items.add(packageName.replace(".", File.separator))
244+
items.add(pkg)
245+
246+
return Path.of(items.joinToString(File.separator))
247+
}
248+
249+
private fun ApiOptions.getResourceDir(): Path {
250+
val items = mutableListOf(targetDir)
251+
if (TargetDirLayout.isStandard(targetDirLayout)) {
252+
items.add("resources")
253+
}
254+
255+
return Path.of(items.joinToString(File.separator))
216256
}

0 commit comments

Comments
 (0)