Skip to content

Commit c8163e5

Browse files
committed
refactor: OpenAPI-based generator and Maven Plugin Java 8 compatible
Signed-off-by: Marc Nuri <[email protected]>
1 parent b44ee5b commit c8163e5

File tree

9 files changed

+158
-128
lines changed

9 files changed

+158
-128
lines changed

kubernetes-model-generator/openapi/maven-plugin/pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232
<packaging>maven-plugin</packaging>
3333

3434
<properties>
35-
<maven.compiler.release>11</maven.compiler.release>
36-
<maven.compiler.target>11</maven.compiler.target>
37-
<maven.compiler.source>11</maven.compiler.source>
35+
<!-- <maven.compiler.release>11</maven.compiler.release>-->
36+
<!-- <maven.compiler.target>11</maven.compiler.target>-->
37+
<!-- <maven.compiler.source>11</maven.compiler.source>-->
3838
<maven.deploy.skip>true</maven.deploy.skip><!-- Keep module private -->
3939
</properties>
4040

kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/ApiVersion.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class ApiVersion {
2727

2828
@Override
2929
public String toString() {
30-
if (group == null || group.isBlank()) {
30+
if (group == null || group.trim().isEmpty()) {
3131
return version;
3232
}
3333
return group + "/" + version;

kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/GeneratorUtils.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
package io.fabric8.kubernetes.schema.generator;
1818

1919
import org.apache.commons.io.FileUtils;
20+
import org.apache.commons.io.IOUtils;
2021

2122
import java.io.File;
2223
import java.io.IOException;
24+
import java.io.InputStream;
2325
import java.nio.charset.StandardCharsets;
2426
import java.nio.file.Files;
2527
import java.nio.file.Path;
@@ -56,8 +58,9 @@ public GeneratorUtils(GeneratorSettings settings) {
5658
}
5759

5860
public String readTemplate(String name) {
59-
try (var stream = SchemaUtils.class.getResourceAsStream("/templates/" + name + ".mustache")) {
60-
return new String(Objects.requireNonNull(stream).readAllBytes(), StandardCharsets.UTF_8);
61+
try (InputStream stream = Objects
62+
.requireNonNull(SchemaUtils.class.getResourceAsStream("/templates/" + name + ".mustache"))) {
63+
return IOUtils.toString(stream, StandardCharsets.UTF_8);
6164
} catch (IOException ex) {
6265
settings.getLogger().severe(ex.getMessage());
6366
throw new GeneratorException("Can't load template " + name);
@@ -66,7 +69,7 @@ public String readTemplate(String name) {
6669

6770
public final void writeFile(Path file, String fileContents) {
6871
try {
69-
Files.writeString(file, fileContents,
72+
Files.write(file, fileContents.getBytes(StandardCharsets.UTF_8),
7073
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
7174
} catch (IOException ex) {
7275
settings.getLogger().severe(ex.getMessage());

kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/ImportOrderComparator.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
*/
1616
package io.fabric8.kubernetes.schema.generator;
1717

18+
import java.util.Arrays;
1819
import java.util.Comparator;
20+
import java.util.HashSet;
1921
import java.util.Set;
2022

2123
public class ImportOrderComparator implements Comparator<String> {
22-
private static final Set<String> JAVA_PACKAGES = Set.of("java", "javax");
24+
private static final Set<String> JAVA_PACKAGES = new HashSet<>(Arrays.asList("java", "javax"));
2325

2426
@Override
2527
public int compare(String o1, String o2) {

kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/SchemaUtils.java

+92-69
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
import io.swagger.v3.oas.models.media.StringSchema;
2525

2626
import java.util.Arrays;
27+
import java.util.Collections;
2728
import java.util.HashMap;
29+
import java.util.HashSet;
30+
import java.util.LinkedHashMap;
2831
import java.util.Locale;
2932
import java.util.Map;
3033
import java.util.Objects;
@@ -40,64 +43,82 @@ public class SchemaUtils {
4043
private static final String OBJECT_PRIMITIVE = "Object";
4144
private static final String STRING_PRIMITIVE = "String";
4245

43-
private static final Map<String, String> REF_TO_JAVA_TYPE_MAP = Map.of(
44-
"#/components/schemas/io.k8s.apimachinery.pkg.util.intstr.IntOrString", "io.fabric8.kubernetes.api.model.IntOrString",
45-
"#/components/schemas/io.k8s.apimachinery.pkg.api.resource.Quantity", "io.fabric8.kubernetes.api.model.Quantity",
46-
"#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", "io.fabric8.kubernetes.api.model.ObjectMeta",
47-
"#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta_v2", "io.fabric8.kubernetes.api.model.ObjectMeta",
48-
"#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension", "io.fabric8.kubernetes.api.model.KubernetesResource",
49-
"#/components/schemas/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON",
50-
"com.fasterxml.jackson.databind.JsonNode",
51-
"#/components/schemas/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON",
52-
"com.fasterxml.jackson.databind.JsonNode");
53-
54-
private static final Map<String, String> REF_TO_JAVA_PRIMITIVE_MAP = Map.of(
55-
"#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time", "String");
56-
57-
private static final Map<String, String> JAVA_CLASS_SERIALIZER_MAP = Map.of(
58-
"io.fabric8.kubernetes.api.model.MicroTime", "io.fabric8.kubernetes.api.model.MicroTimeSerDes.Serializer.class",
59-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArray",
60-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArraySerDe.Serializer.class",
61-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArray",
62-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArraySerDe.Serializer.class",
63-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBool",
64-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBoolSerDe.Serializer.class",
65-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBool",
66-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBoolSerDe.Serializer.class",
67-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArray",
68-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArraySerDe.Serializer.class",
69-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArray",
70-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArraySerDe.Serializer.class");
71-
72-
private static final Map<String, String> JAVA_CLASS_DESERIALIZER_MAP = Map.of(
73-
"io.fabric8.kubernetes.api.model.MicroTime", "io.fabric8.kubernetes.api.model.MicroTimeSerDes.Deserializer.class",
74-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArray",
75-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArraySerDe.Deserializer.class",
76-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArray",
77-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArraySerDe.Deserializer.class",
78-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBool",
79-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBoolSerDe.Deserializer.class",
80-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBool",
81-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBoolSerDe.Deserializer.class",
82-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArray",
83-
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArraySerDe.Deserializer.class",
84-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArray",
85-
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArraySerDe.Deserializer.class");
86-
87-
private static final Map<String, String> REF_SERIALIZER_MAP = Map.of(
88-
// "#/components/schemas/io.k8s.apimachinery.pkg.util.intstr.IntOrString", "com.marcnuri.yakc.model.serialization.IntOrStringSerializer.class"
89-
);
90-
91-
private static final Map<String, String> TYPE_MAP = Map.of(
92-
"boolean", "Boolean",
93-
"int32", "Integer",
94-
"int64", "Long",
95-
"double", "Double",
96-
"number", "Number",
97-
"object", OBJECT_PRIMITIVE,
98-
"string", STRING_PRIMITIVE);
99-
100-
private static final Set<String> PROTECTED_WORDS = Set.of(
46+
private static final Map<String, String> REF_TO_JAVA_TYPE_MAP = new LinkedHashMap<>();
47+
static {
48+
REF_TO_JAVA_TYPE_MAP.put("#/components/schemas/io.k8s.apimachinery.pkg.util.intstr.IntOrString",
49+
"io.fabric8.kubernetes.api.model.IntOrString");
50+
REF_TO_JAVA_TYPE_MAP.put("#/components/schemas/io.k8s.apimachinery.pkg.api.resource.Quantity",
51+
"io.fabric8.kubernetes.api.model.Quantity");
52+
REF_TO_JAVA_TYPE_MAP.put("#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta",
53+
"io.fabric8.kubernetes.api.model.ObjectMeta");
54+
REF_TO_JAVA_TYPE_MAP.put("#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta_v2",
55+
"io.fabric8.kubernetes.api.model.ObjectMeta");
56+
REF_TO_JAVA_TYPE_MAP.put("#/components/schemas/io.k8s.apimachinery.pkg.runtime.RawExtension",
57+
"io.fabric8.kubernetes.api.model.KubernetesResource");
58+
REF_TO_JAVA_TYPE_MAP.put("#/components/schemas/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.JSON",
59+
"com.fasterxml.jackson.databind.JsonNode");
60+
REF_TO_JAVA_TYPE_MAP.put("#/components/schemas/io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.JSON",
61+
"com.fasterxml.jackson.databind.JsonNode");
62+
}
63+
64+
private static final Map<String, String> REF_TO_JAVA_PRIMITIVE_MAP = new LinkedHashMap<>();
65+
static {
66+
REF_TO_JAVA_PRIMITIVE_MAP.put("#/components/schemas/io.k8s.apimachinery.pkg.apis.meta.v1.Time", "String");
67+
}
68+
69+
private static final Map<String, String> JAVA_CLASS_SERIALIZER_MAP = new LinkedHashMap<>();
70+
static {
71+
JAVA_CLASS_SERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.MicroTime",
72+
"io.fabric8.kubernetes.api.model.MicroTimeSerDes.Serializer.class");
73+
JAVA_CLASS_SERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArray",
74+
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArraySerDe.Serializer.class");
75+
JAVA_CLASS_SERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArray",
76+
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArraySerDe.Serializer.class");
77+
JAVA_CLASS_SERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBool",
78+
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBoolSerDe.Serializer.class");
79+
JAVA_CLASS_SERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBool",
80+
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBoolSerDe.Serializer.class");
81+
JAVA_CLASS_SERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArray",
82+
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArraySerDe.Serializer.class");
83+
JAVA_CLASS_SERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArray",
84+
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArraySerDe.Serializer.class");
85+
}
86+
87+
private static final Map<String, String> JAVA_CLASS_DESERIALIZER_MAP = new LinkedHashMap<>();
88+
static {
89+
JAVA_CLASS_DESERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.MicroTime",
90+
"io.fabric8.kubernetes.api.model.MicroTimeSerDes.Deserializer.class");
91+
JAVA_CLASS_DESERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArray",
92+
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrArraySerDe.Deserializer.class");
93+
JAVA_CLASS_DESERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArray",
94+
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrArraySerDe.Deserializer.class");
95+
JAVA_CLASS_DESERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBool",
96+
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrBoolSerDe.Deserializer.class");
97+
JAVA_CLASS_DESERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBool",
98+
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrBoolSerDe.Deserializer.class");
99+
JAVA_CLASS_DESERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArray",
100+
"io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsOrStringArraySerDe.Deserializer.class");
101+
JAVA_CLASS_DESERIALIZER_MAP.put("io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArray",
102+
"io.fabric8.kubernetes.api.model.apiextensions.v1beta1.JSONSchemaPropsOrStringArraySerDe.Deserializer.class");
103+
}
104+
105+
private static final Map<String, String> REF_SERIALIZER_MAP = Collections.emptyMap();// new LinkedHashMap<>();
106+
static {
107+
// REF_SERIALIZER_MAP.put("#/components/schemas/io.k8s.apimachinery.pkg.util.intstr.IntOrString", "com.marcnuri.yakc.model.serialization.IntOrStringSerializer.class");
108+
}
109+
110+
private static final Map<String, String> TYPE_MAP = new LinkedHashMap<>();
111+
static {
112+
TYPE_MAP.put("boolean", "Boolean");
113+
TYPE_MAP.put("int32", "Integer");
114+
TYPE_MAP.put("int64", "Long");
115+
TYPE_MAP.put("double", "Double");
116+
TYPE_MAP.put("number", "Number");
117+
TYPE_MAP.put("object", OBJECT_PRIMITIVE);
118+
TYPE_MAP.put("string", STRING_PRIMITIVE);
119+
}
120+
121+
private static final Set<String> PROTECTED_WORDS = new HashSet<>(Arrays.asList(
101122
"continue",
102123
"default",
103124
"enum",
@@ -107,7 +128,7 @@ public class SchemaUtils {
107128
"private",
108129
"for",
109130
"return",
110-
"package");
131+
"package"));
111132

112133
private final GeneratorSettings settings;
113134

@@ -168,16 +189,18 @@ public String schemaToClassName(Consumer<String> addImport, Schema<?> schema) {
168189
if (isString(schema)) {
169190
return "String";
170191
}
171-
if (ref != null && !ref.isBlank()) {
172-
return schemaRefToJavaPrimitive(schema)
173-
.or(() -> schemaRefToJavaType(schema).map(javaType -> {
174-
addImport.accept(javaType);
175-
return javaType.substring(javaType.lastIndexOf('.') + 1);
176-
}))
177-
.orElseGet(() -> {
178-
addImport.accept(refToModelPackage(ref));
179-
return refToClassName(ref);
180-
});
192+
if (ref != null && !ref.trim().isEmpty()) {
193+
final Optional<String> javaPrimitive = schemaRefToJavaPrimitive(schema);
194+
if (javaPrimitive.isPresent()) {
195+
return javaPrimitive.get();
196+
}
197+
final Optional<String> javaType = schemaRefToJavaType(schema);
198+
if (javaType.isPresent()) {
199+
addImport.accept(javaType.get());
200+
return javaType.get().substring(javaType.get().lastIndexOf('.') + 1);
201+
}
202+
addImport.accept(refToModelPackage(ref));
203+
return refToClassName(ref);
181204
}
182205
// Plain OpenAPI object map to KubernetesResource (deserializer will take care of the rest)
183206
if (isObject(schema)) {

kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ModelGenerator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ private void processTemplate(TemplateContext ret) {
118118
.orElse("com.fasterxml.jackson.databind.JsonDeserializer.None.class"));
119119
ret.put("package", ret.getPackageName());
120120
if (settings.isGenerateJavadoc()) {
121-
ret.put("hasDescription", !sanitizeDescription(ret.getClassSchema().getDescription()).isBlank());
121+
ret.put("hasDescription", !sanitizeDescription(ret.getClassSchema().getDescription()).trim().isEmpty());
122122
ret.put("description", sanitizeDescription(ret.getClassSchema().getDescription()));
123123
}
124124
ret.addImport("com.fasterxml.jackson.annotation.JsonInclude");
@@ -162,7 +162,7 @@ private List<Map<String, Object>> templateFields(TemplateContext templateContext
162162
templateProp.put("required", true);
163163
}
164164
if (settings.isGenerateJavadoc()) {
165-
templateProp.put("hasDescription", !sanitizeDescription(propertySchema.getDescription()).isBlank());
165+
templateProp.put("hasDescription", !sanitizeDescription(propertySchema.getDescription()).trim().isEmpty());
166166
templateProp.put("description", sanitizeDescription(propertySchema.getDescription()));
167167
}
168168
final String serializeUsing = serializerForSchema(propertySchema);

kubernetes-model-generator/openapi/maven-plugin/src/test/java/io/fabric8/kubernetes/schema/generator/ApiVersionTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class ApiVersionTest {
2929
"group, v1, group/v1",
3030
})
3131
void toString(String group, String version, String expected) {
32-
final var result = ApiVersion.builder().group(group).version(version).build()
32+
final String result = ApiVersion.builder().group(group).version(version).build()
3333
.toString();
3434
assertEquals(expected, result);
3535
}

0 commit comments

Comments
 (0)