Skip to content

Commit ed56f44

Browse files
committed
openapi-processor/openapi-processor-spring#198, add string values constraints annotation
1 parent f754f8f commit ed56f44

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ class BeanValidations(val format: BeanValidationFormat = BeanValidationFormat.JA
1919
val PATTERN = "${format.pkg}.validation.constraints.Pattern"
2020
val SIZE = "${format.pkg}.validation.constraints.Size"
2121
val VALID = "${format.pkg}.validation.Valid"
22+
val VALUES = "support.validation.Values"
2223
}

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.openapiprocessor.core.writer.java
77

8+
import io.openapiprocessor.core.converter.ApiOptions
89
import io.openapiprocessor.core.converter.mapping.ParameterValue
910
import io.openapiprocessor.core.converter.mapping.SimpleParameterValue
1011
import io.openapiprocessor.core.model.Annotation
@@ -15,9 +16,9 @@ import org.apache.commons.text.StringEscapeUtils.escapeJava
1516
* creates bean validation imports and annotations.
1617
*/
1718
open class BeanValidationFactory(
18-
val format: BeanValidationFormat = BeanValidationFormat.JAVAX
19+
private val options: ApiOptions
1920
) {
20-
val validations: BeanValidations = BeanValidations(format)
21+
val validations: BeanValidations = BeanValidations(getValidationFormat())
2122

2223
/**
2324
* override to add annotations to the model object class.
@@ -73,6 +74,10 @@ open class BeanValidationFactory(
7374
annotations.add(createEmailAnnotation())
7475
}
7576

77+
if (sourceDataType.valuesConstraint()) {
78+
annotations.add(createValuesAnnotation(dataType))
79+
}
80+
7681
return annotations
7782
}
7883

@@ -141,6 +146,26 @@ open class BeanValidationFactory(
141146
private fun createEmailAnnotation(): Annotation {
142147
return Annotation(validations.EMAIL)
143148
}
149+
150+
private fun createValuesAnnotation(dataType: DataType): Annotation {
151+
val parameters = linkedMapOf<String, ParameterValue>()
152+
153+
val params = StringBuilder()
154+
params.append("{")
155+
params.append(dataType.constraints!!.values.joinToString(", ") { """"$it"""" })
156+
params.append("}")
157+
158+
parameters["values"] = SimpleParameterValue(params.toString())
159+
return Annotation("${options.packageName}.${validations.VALUES}", parameters)
160+
}
161+
162+
private fun getValidationFormat(): BeanValidationFormat {
163+
val format = options.beanValidationFormat
164+
return if (format != null)
165+
BeanValidationFormat.valueOf(format.uppercase())
166+
else
167+
BeanValidationFormat.JAVAX
168+
}
144169
}
145170

146171
private fun DataType.shouldHaveValid(): Boolean {
@@ -194,3 +219,5 @@ private fun DataType.itemConstraints(): SizeConstraints = constraints?.itemConst
194219
private fun DataType.patternConstraint(): Boolean = constraints?.pattern != null
195220

196221
private fun DataType.emailConstraint(): Boolean = "email" == constraints?.format
222+
223+
private fun DataType.valuesConstraint(): Boolean = isString() && constraints?.values?.isNotEmpty() == true

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import io.kotest.core.spec.IsolationMode
99
import io.kotest.core.spec.style.StringSpec
1010
import io.kotest.matchers.collections.shouldBeEmpty
1111
import io.kotest.matchers.shouldBe
12+
import io.openapiprocessor.core.converter.ApiOptions
1213
import io.openapiprocessor.core.model.datatypes.*
1314
import io.openapiprocessor.core.support.datatypes.ListDataType
1415
import io.openapiprocessor.core.support.datatypes.ObjectDataType
@@ -18,7 +19,8 @@ import io.openapiprocessor.core.support.datatypes.propertyDataTypeString
1819
class BeanValidationFactorySpec : StringSpec({
1920
isolationMode = IsolationMode.InstancePerTest
2021

21-
val validation = BeanValidationFactory()
22+
val apiOptions = ApiOptions()
23+
val validation = BeanValidationFactory(apiOptions)
2224
val validations = validation.validations
2325

2426
"applies @Valid to 'array' with object items" {
@@ -175,4 +177,21 @@ class BeanValidationFactorySpec : StringSpec({
175177
io.imports shouldBe setOf(validations.EMAIL)
176178
io.annotations.shouldBeEmpty()
177179
}
180+
181+
"applies @Values to String" {
182+
apiOptions.packageName = "package.name"
183+
184+
val dataType = StringDataType(constraints = DataTypeConstraints(values = listOf("foo", "bar")))
185+
val info = validation.validate(dataType)
186+
187+
val prop = info.prop
188+
prop.dataTypeValue shouldBe "String"
189+
prop.imports shouldBe setOf("${apiOptions.packageName}.support.validation.Values")
190+
prop.annotations shouldBe setOf("""@Values(values = {"foo", "bar"})""")
191+
192+
val io = info.inout
193+
io.dataTypeValue shouldBe """@Values(values = {"foo", "bar"}) String"""
194+
io.imports shouldBe setOf("${apiOptions.packageName}.support.validation.Values")
195+
io.annotations.shouldBeEmpty()
196+
}
178197
})

0 commit comments

Comments
 (0)