Skip to content

Commit 139e800

Browse files
committed
#198, add enum converter factory
1 parent e36a872 commit 139e800

File tree

4 files changed

+121
-0
lines changed

4 files changed

+121
-0
lines changed

src/main/kotlin/io/openapiprocessor/spring/processor/SpringProcessor.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class SpringProcessor {
8585
generatedWriter,
8686
javaDocWriter
8787
),
88+
listOf(AdditionalEnumWriter()::write),
8889
GoogleFormatter(),
8990
writerFactory
9091
)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2023 https://github.com/openapi-processor/openapi-processor-spring
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.spring.writer.java
7+
8+
import io.openapiprocessor.core.converter.ApiOptions
9+
import io.openapiprocessor.core.writer.SourceFormatter
10+
import io.openapiprocessor.core.writer.WriterFactory
11+
import java.io.StringWriter
12+
import java.io.Writer
13+
14+
class AdditionalEnumWriter {
15+
16+
fun write(options: ApiOptions, formatter: SourceFormatter, factory: WriterFactory) {
17+
if (options.enumType != "framework") {
18+
return
19+
}
20+
21+
val writer = createFactoryWriter(options, factory)
22+
writeEnumConverterFactory(options, writer, formatter)
23+
writer.close()
24+
}
25+
26+
private fun writeEnumConverterFactory(options: ApiOptions, writer: Writer, formatter: SourceFormatter) {
27+
val raw = StringWriter()
28+
EnumConverterFactoryWriter(options).writeConverterFactory(raw)
29+
writer.write(formatter.format(raw.toString()))
30+
}
31+
32+
private fun createFactoryWriter(options: ApiOptions, writerFactory: WriterFactory): Writer {
33+
return writerFactory.createWriter(
34+
"${options.packageName}.spring",
35+
"StringToEnumConverterFactory")
36+
}
37+
38+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright 2023 https://github.com/openapi-processor/openapi-processor-spring
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.spring.writer.java
7+
8+
import io.openapiprocessor.core.converter.ApiOptions
9+
import java.io.Writer
10+
11+
class EnumConverterFactoryWriter(val options: ApiOptions) {
12+
13+
fun writeConverterFactory(target: Writer) {
14+
target.write("""
15+
package ${options.packageName}.spring;
16+
17+
import org.springframework.core.convert.converter.Converter;
18+
import org.springframework.core.convert.converter.ConverterFactory;
19+
import org.springframework.stereotype.Component;
20+
21+
import java.util.EnumSet;
22+
import java.util.function.Supplier;
23+
24+
public class StringToEnumConverterFactory<T extends Enum<T> & Supplier<String>>
25+
implements ConverterFactory<String, T> {
26+
27+
@Override
28+
@SuppressWarnings({"unchecked", "rawtypes"})
29+
public <E extends T> Converter<String, E> getConverter(Class<E> targetType) {
30+
return new StringToEnumConverter(targetType);
31+
}
32+
33+
static class StringToEnumConverter<T extends Enum<T> & Supplier<String>> implements Converter<String, T> {
34+
35+
private final Class<T> enumType;
36+
37+
public StringToEnumConverter(Class<T> enumType) {
38+
this.enumType = enumType;
39+
}
40+
41+
public T convert(String source) {
42+
String sourceValue = source.trim();
43+
44+
for (T e : EnumSet.allOf(enumType)) {
45+
if (e.get().equals(sourceValue)) {
46+
return e;
47+
}
48+
}
49+
50+
throw new IllegalArgumentException(String.format("No enum constant of %s has the value %s",
51+
enumType.getCanonicalName(),
52+
sourceValue));
53+
}
54+
}
55+
}
56+
""".trimIndent())
57+
}
58+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright 2023 https://github.com/openapi-processor/openapi-processor-spring
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.spring.writer.java
7+
8+
import io.openapiprocessor.core.converter.ApiOptions
9+
import io.openapiprocessor.core.writer.DefaultWriterFactory
10+
import java.nio.file.Path
11+
12+
class SpringWriterFactory(options: ApiOptions): DefaultWriterFactory(options) {
13+
14+
override fun initAdditionalPackages(options: ApiOptions): Map<String, Path> {
15+
val pkgPaths = HashMap<String, Path>()
16+
17+
if (options.enumType == "framework") {
18+
val (name, path) = initTargetPackage("spring")
19+
pkgPaths[name] = path
20+
}
21+
22+
return pkgPaths
23+
}
24+
}

0 commit comments

Comments
 (0)