From fd327253a44d876683da477a401c76548f0cb50c Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 25 Oct 2024 11:14:59 +0200 Subject: [PATCH] feat(openapi): generated classes can implement interfaces Signed-off-by: Marc Nuri --- .../openapi/maven-plugin/pom.xml | 5 ++ .../generator/model/ClassInformation.java | 88 +++++++++++++++++++ .../generator/model/ModelGenerator.java | 79 ++++------------- .../generator/model/TemplateContext.java | 22 +---- .../schema/generator/schema/SchemaUtils.java | 9 ++ .../main/resources/templates/model.mustache | 2 +- .../templates/model_constructors.mustache | 4 +- .../templates/model_methods.mustache | 6 +- .../generator/model/TemplateContextTest.java | 36 ++++---- 9 files changed, 146 insertions(+), 105 deletions(-) diff --git a/kubernetes-model-generator/openapi/maven-plugin/pom.xml b/kubernetes-model-generator/openapi/maven-plugin/pom.xml index 84ab0c94bb..c2cc627f04 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/pom.xml +++ b/kubernetes-model-generator/openapi/maven-plugin/pom.xml @@ -16,6 +16,11 @@ limitations under the License. --> + diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ClassInformation.java b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ClassInformation.java index 40240807ea..841107e93c 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ClassInformation.java +++ b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ClassInformation.java @@ -28,17 +28,35 @@ @Getter public class ClassInformation implements ImportManager { + private final SchemaUtils schemaUtils; private final Set imports; + private final String kubernetesListType; private final String packageName; + private final boolean inRootPackage; private final boolean isInterface; + private final boolean isHasMetadata; + private final boolean isNamespaced; + private final String classSimpleName; + private final String className; + private final String implementedInterfaces; private final JsonSubTypes jsonSubTypes; ClassInformation(SchemaUtils schemaUtils, Map.Entry> clazz) { + this.schemaUtils = schemaUtils; imports = new TreeSet<>(new ImportOrderComparator()); final var classKey = clazz.getKey(); final var classSchema = clazz.getValue(); + final var apiVersion = schemaUtils.getSettings().getApiVersions().get(classKey); + // packageName must be resolved first, since the rest of computed fields depend on it packageName = schemaUtils.toModelPackage(classKey.substring(0, classKey.lastIndexOf('.'))); + kubernetesListType = apiVersion == null ? null : schemaUtils.kubernetesListType(this, classSchema); + inRootPackage = getPackageName().equals(schemaUtils.getSettings().getPackageName()); isInterface = SchemaUtils.isInterface(classSchema); + isHasMetadata = apiVersion != null && kubernetesListType == null && schemaUtils.isHasMetadata(classSchema); + isNamespaced = apiVersion != null && apiVersion.isNamespaced(); + classSimpleName = SchemaUtils.refToClassName(classKey); + className = getPackageName() + "." + getClassSimpleName(); + implementedInterfaces = resolveImplementedInterfaces(classSchema); if (isInterface) { addImport("com.fasterxml.jackson.annotation.JsonSubTypes"); addImport("com.fasterxml.jackson.annotation.JsonTypeInfo"); @@ -49,7 +67,77 @@ public class ClassInformation implements ImportManager { } } + @Override + public boolean hasSimpleClassName(String className) { + // If the provided class name matches the current class simple name it means that we'll need the fully + // qualified class name to avoid conflicts. + if (simpleClassName(className).equals(getClassSimpleName())) { + return true; + } + return ImportManager.super.hasSimpleClassName(className); + } + boolean isEditable() { return !isInterface(); } + + public final String getClassInterface() { + return isInterface() ? "interface" : "class"; + } + + public final String getBuilderName() { + return getClassSimpleName() + "Builder"; + } + + private String resolveImplementedInterfaces(Schema classSchema) { + final StringBuilder implementedInterfaces = new StringBuilder(); + final var interfaceImplemented = SchemaUtils.interfaceImplemented(classSchema); + if (interfaceImplemented != null) { + implementedInterfaces.append(interfaceImplemented).append(", "); + } + if (isEditable()) { + addImport("com.fasterxml.jackson.annotation.JsonIgnore"); + addImport(schemaUtils.getSettings().getBuilderPackage() + "." + "Editable"); + implementedInterfaces.append("Editable<").append(getBuilderName()).append(">"); + implementedInterfaces.append(" , "); // TODO: weird comma introduced by jsonschema2pojo + } + // HasMetadata + if (isHasMetadata()) { + if (!isInRootPackage()) { + addImport(schemaUtils.getSettings().getHasMetadataClass()); + } + implementedInterfaces.append(schemaUtils.getSettings().getHasMetadataClassSimpleName()); + } + // KubernetesResource + else { + if (getClassSimpleName().equals(schemaUtils.getSettings().getKubernetesResourceClassSimpleName())) { + // There's a class actually named KubernetesResource in the tekton package + implementedInterfaces.append(schemaUtils.getSettings().getKubernetesResourceClass()); + } else { + if (!isInRootPackage()) { + addImport(schemaUtils.getSettings().getKubernetesResourceClass()); + } + implementedInterfaces.append(schemaUtils.getSettings().getKubernetesResourceClassSimpleName()); + } + } + // Namespaced + if (isNamespaced() && getKubernetesListType() == null) { + if (!isInRootPackage()) { + addImport(schemaUtils.getSettings().getNamespacedClass()); + } + implementedInterfaces.append(", ").append(schemaUtils.getSettings().getNamespacedClassSimpleName()); + } + // KubernetesResourceList + if (getKubernetesListType() != null) { + if (!isInRootPackage()) { + addImport(schemaUtils.getSettings().getKubernetesResourceListClass()); + } + implementedInterfaces.append(", ").append(schemaUtils.getSettings().getKubernetesResourceListClassSimpleName()) + .append("<") + // TODO: remove after generator migration, match jsonschema2pojo generation for KubernetesResourceList + .append(getPackageName()).append(".").append(getKubernetesListType()) + .append(">"); + } + return implementedInterfaces.toString(); + } } diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ModelGenerator.java b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ModelGenerator.java index 48eb7dd09d..332b8ca84a 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ModelGenerator.java +++ b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/ModelGenerator.java @@ -85,10 +85,12 @@ void generate() { .forEach(classEntry -> { final TemplateContext templateContext = new TemplateContext(settings, classEntry); if (hasOverride(templateContext)) { - settings.getLogger().fine(String.format("Skipping %s since it has an override", templateContext.getClassName())); + settings.getLogger().fine(String.format("Skipping %s since it has an override", + templateContext.getClassInformation().getClassSimpleName())); return; } - settings.getLogger().fine(String.format("Generating %ss", templateContext.getClassName())); + settings.getLogger() + .fine(String.format("Generating %ss", templateContext.getClassInformation().getClassSimpleName())); mkPackageDirectories(templateContext); processTemplate(templateContext); final String fileContents = modelTemplate.execute(templateContext.getContext()); @@ -105,7 +107,7 @@ private void processTemplate(TemplateContext ret) { ret.addImport("io.fabric8.kubernetes.model.annotation.Version"); ret.put("version", ret.getApiVersion().getVersion()); // TODO: we might want to generify this logic for other annotations and imports - if (Objects.equals("Group", ret.getClassSimpleName())) { + if (Objects.equals("Group", ret.getClassInformation().getClassSimpleName())) { ret.put("group", "@io.fabric8.kubernetes.model.annotation.Group(\"" + ret.getApiVersion().getGroup() + "\")"); } else { ret.addImport("io.fabric8.kubernetes.model.annotation.Group"); @@ -115,7 +117,7 @@ private void processTemplate(TemplateContext ret) { ret.addImport("io.sundr.transform.annotations.TemplateTransformations"); ret.put("kubernetesResourceClass", settings.getKubernetesResourceClass()); } - final String serializer = serializerForJavaClass(ret.getClassName()); + final String serializer = serializerForJavaClass(ret.getClassInformation().getClassSimpleName()); if (serializer != null) { ret.addImport("com.fasterxml.jackson.databind.annotation.JsonSerialize"); ret.put("classJsonSerializeUsing", serializer); @@ -123,8 +125,8 @@ private void processTemplate(TemplateContext ret) { final String deserializer; if (SchemaUtils.hasInterfaceFields(ret.getClassSchema())) { deserializer = "io.fabric8.kubernetes.model.jackson.JsonUnwrappedDeserializer.class"; - } else if (deserializerForJavaClass(ret.getClassName()) != null) { - deserializer = deserializerForJavaClass(ret.getClassName()); + } else if (deserializerForJavaClass(ret.getClassInformation().getClassSimpleName()) != null) { + deserializer = deserializerForJavaClass(ret.getClassInformation().getClassSimpleName()); } else { deserializer = "com.fasterxml.jackson.databind.JsonDeserializer.None.class"; } @@ -146,10 +148,7 @@ private void processTemplate(TemplateContext ret) { ret.put("hasDescription", !sanitizeDescription(ret.getClassSchema().getDescription()).trim().isEmpty()); ret.put("description", sanitizeDescription(ret.getClassSchema().getDescription())); } - ret.put("classInterface", ret.getClassInformation().isInterface() ? "interface" : "class"); - ret.put("className", ret.getClassSimpleName()); ret.put("implementsExtends", ret.getClassInformation().isInterface() ? "extends" : "implements"); - ret.put("implementedInterfaces", resolveImplementedInterfaces(ret)); final List> templateFields = templateFields(ret); ret.put("fields", templateFields); if (!templateFields.isEmpty()) { @@ -225,7 +224,7 @@ private List> templateFields(TemplateContext templateContext && Objects.equals(type, "String") && templateContext.getApiVersion() != null) { templateProp.put("legacyRequired", true); // TODO: remove after generator migration - templateProp.put("defaultValue", String.format("\"%s\"", templateContext.getClassSimpleName())); + templateProp.put("defaultValue", String.format("\"%s\"", templateContext.getClassInformation().getClassSimpleName())); } else if (Objects.equals(property.getKey(), "apiVersion") && Objects.equals(type, "String") && templateContext.getApiVersion() != null) { @@ -233,10 +232,11 @@ private List> templateFields(TemplateContext templateContext templateProp.put("defaultValue", String.format("\"%s\"", templateContext.getApiVersion())); } // TODO: remove after generator migration, match jsonschema2pojo generation for items - if (templateContext.getKubernetesListType() != null + if (templateContext.getClassInformation().getKubernetesListType() != null && Objects.equals(property.getKey(), "items")) { templateProp.put("type", - "List<" + templateContext.getPackageName() + "." + templateContext.getKubernetesListType() + ">"); + "List<" + templateContext.getPackageName() + "." + templateContext.getClassInformation().getKubernetesListType() + + ">"); } } return properties; @@ -253,7 +253,7 @@ private void mkPackageDirectories(TemplateContext templateContext) { private boolean hasOverride(TemplateContext templateContext) { return settings.getOverridesDirectory().toPath() .resolve(templateContext.getPackageName().replace('.', File.separatorChar)) - .resolve(templateContext.getClassSimpleName().concat(".java")) + .resolve(templateContext.getClassInformation().getClassSimpleName().concat(".java")) .toFile().exists(); } @@ -262,54 +262,6 @@ private Path resolvePackageDirectory(TemplateContext templateContext) { .resolve(templateContext.getPackageName().replace('.', File.separatorChar)); } - private String resolveImplementedInterfaces(TemplateContext templateContext) { - final StringBuilder implementedInterfaces = new StringBuilder(); - if (templateContext.getClassInformation().isEditable()) { - templateContext.addImport("com.fasterxml.jackson.annotation.JsonIgnore"); - templateContext.addImport(settings.getBuilderPackage() + "." + "Editable"); - implementedInterfaces.append("Editable<").append(templateContext.getClassSimpleName()).append("Builder>"); - implementedInterfaces.append(" , "); // TODO: weird comma introduced by jsonschema2pojo - } - // HasMetadata - if (templateContext.isHasMetadata()) { - if (!templateContext.isInRootPackage()) { - templateContext.addImport(settings.getHasMetadataClass()); - } - implementedInterfaces.append(settings.getHasMetadataClassSimpleName()); - } - // KubernetesResource - else { - if (templateContext.getClassSimpleName().equals(settings.getKubernetesResourceClassSimpleName())) { - // There's a class actually named KubernetesResource in the tekton package - implementedInterfaces.append(settings.getKubernetesResourceClass()); - } else { - if (!templateContext.isInRootPackage()) { - templateContext.addImport(settings.getKubernetesResourceClass()); - } - implementedInterfaces.append(settings.getKubernetesResourceClassSimpleName()); - } - } - // Namespaced - if (templateContext.isNamespaced() && templateContext.getKubernetesListType() == null) { - if (!templateContext.isInRootPackage()) { - templateContext.addImport(settings.getNamespacedClass()); - } - implementedInterfaces.append(", ").append(settings.getNamespacedClassSimpleName()); - } - // KubernetesResourceList - if (templateContext.getKubernetesListType() != null) { - if (!templateContext.isInRootPackage()) { - templateContext.addImport(settings.getKubernetesResourceListClass()); - } - implementedInterfaces.append(", ").append(settings.getKubernetesResourceListClassSimpleName()) - .append("<") - // TODO: remove after generator migration, match jsonschema2pojo generation for KubernetesResourceList - .append(templateContext.getPackageName()).append(".").append(templateContext.getKubernetesListType()) - .append(">"); - } - return implementedInterfaces.toString(); - } - private Map> buildableReferences(TemplateContext templateContext, List> fields) { final List references = new ArrayList<>(settings.getBuildableReferences()); references.add(0, settings.getObjectMetaClass()); @@ -321,7 +273,7 @@ private Map> buildableReferences(TemplateContext templateCo return Collections.singletonMap("refs", references.stream() .map(r -> { final String referenceSimpleClass = r.substring(r.lastIndexOf('.') + 1); - if (templateContext.getClassSimpleName().equals(referenceSimpleClass)) { + if (templateContext.getClassInformation().getClassSimpleName().equals(referenceSimpleClass)) { return r; } // Don't add import if there's an import for a class with the same name e.g. ObjectReference in k8s core and monitoring @@ -335,7 +287,8 @@ private Map> buildableReferences(TemplateContext templateCo } private void writeFile(TemplateContext context, String fileContents) { - final Path file = resolvePackageDirectory(context).resolve(context.getClassSimpleName().concat(".java")); + final Path file = resolvePackageDirectory(context) + .resolve(context.getClassInformation().getClassSimpleName().concat(".java")); generatorUtils.writeFile(file, fileContents); } diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/TemplateContext.java b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/TemplateContext.java index 9bc1759b55..101ea1b393 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/TemplateContext.java +++ b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/model/TemplateContext.java @@ -34,12 +34,6 @@ final class TemplateContext implements ImportManager { private final Schema classSchema; private final ApiVersion apiVersion; private final ClassInformation classInformation; - // TODO: Move to ClassInformation - private final boolean inRootPackage; - private final String classSimpleName; - private final String className; - private final boolean hasMetadata; - private final String kubernetesListType; private final Map context; TemplateContext(GeneratorSettings settings, Map.Entry> clazz) { @@ -48,11 +42,6 @@ final class TemplateContext implements ImportManager { classSchema = clazz.getValue(); apiVersion = settings.getApiVersions().get(classKey); classInformation = new ClassInformation(schemaUtils, clazz); - inRootPackage = getClassInformation().getPackageName().equals(settings.getPackageName()); - classSimpleName = SchemaUtils.refToClassName(classKey); - className = getClassInformation().getPackageName() + "." + classSimpleName; - kubernetesListType = apiVersion == null ? null : schemaUtils.kubernetesListType(this, classSchema); - hasMetadata = apiVersion != null && kubernetesListType == null && schemaUtils.isHasMetadata(classSchema); context = new HashMap<>(); context.put("imports", classInformation.getImports()); context.put("classInformation", classInformation); @@ -66,10 +55,6 @@ Map getSchemaProperties() { return classSchema.getProperties() == null ? Collections.emptyMap() : classSchema.getProperties(); } - boolean isNamespaced() { - return getApiVersion() != null && getApiVersion().isNamespaced(); - } - @Override public String getPackageName() { return getClassInformation().getPackageName(); @@ -82,11 +67,6 @@ public Collection getImports() { @Override public boolean hasSimpleClassName(String className) { - // If the provided class name matches the current class simple name it means that we'll need the fully - // qualified class name to avoid conflicts. - if (simpleClassName(className).equals(classSimpleName)) { - return true; - } - return ImportManager.super.hasSimpleClassName(className); + return getClassInformation().hasSimpleClassName(className); } } diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/schema/SchemaUtils.java b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/schema/SchemaUtils.java index f8eaecb605..d95ae2fe51 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/schema/SchemaUtils.java +++ b/kubernetes-model-generator/openapi/maven-plugin/src/main/java/io/fabric8/kubernetes/schema/generator/schema/SchemaUtils.java @@ -29,6 +29,7 @@ import io.swagger.v3.oas.models.media.MapSchema; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.media.StringSchema; +import lombok.Getter; import java.util.Arrays; import java.util.Collection; @@ -45,6 +46,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +@Getter public class SchemaUtils { public static final String APPLICATION_JSON = "application/json"; @@ -282,6 +284,13 @@ public static List interfaceImplementation(Schema schema) { return Collections.emptyList(); } + public static String interfaceImplemented(Schema schema) { + if (schema.getExtensions() != null && schema.getExtensions().containsKey("x-kubernetes-fabric8-implements")) { + return refToClassName(schema.getExtensions().get("x-kubernetes-fabric8-implements").toString()); + } + return null; + } + public static boolean isArray(Schema schema) { return schema instanceof ArraySchema; } diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model.mustache b/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model.mustache index 07d8bc4f56..cfa2bc23d2 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model.mustache +++ b/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model.mustache @@ -24,7 +24,7 @@ import {{.}}; /** * {{description}} */{{/hasDescription}} -{{> model_class_annotations}}public {{classInterface}} {{className}} {{implementsExtends}} {{implementedInterfaces}} +{{> model_class_annotations}}public {{classInformation.classInterface}} {{classInformation.classSimpleName}} {{implementsExtends}} {{classInformation.implementedInterfaces}} { {{>model_fields}} diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_constructors.mustache b/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_constructors.mustache index bab94ac7fa..dac8154147 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_constructors.mustache +++ b/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_constructors.mustache @@ -17,10 +17,10 @@ * No args constructor for use in serialization *{{emptySpace}} */ - public {{className}}() { + public {{classInformation.classSimpleName}}() { } - public {{className}}({{#fields}}{{type}} {{name}}{{^-last}}, {{/-last}}{{/fields}}) { + public {{classInformation.classSimpleName}}({{#fields}}{{type}} {{name}}{{^-last}}, {{/-last}}{{/fields}}) { super(); {{#fields}} this.{{name}} = {{name}}; diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_methods.mustache b/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_methods.mustache index e093e25d83..25e3217cfb 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_methods.mustache +++ b/kubernetes-model-generator/openapi/maven-plugin/src/main/resources/templates/model_methods.mustache @@ -50,12 +50,12 @@ {{/fields}} {{#editable}} @JsonIgnore - public {{className}}Builder edit() { - return new {{className}}Builder(this); + public {{classInformation.builderName}} edit() { + return new {{classInformation.builderName}}(this); } @JsonIgnore - public {{className}}Builder toBuilder() { + public {{classInformation.builderName}} toBuilder() { return edit(); } diff --git a/kubernetes-model-generator/openapi/maven-plugin/src/test/java/io/fabric8/kubernetes/schema/generator/model/TemplateContextTest.java b/kubernetes-model-generator/openapi/maven-plugin/src/test/java/io/fabric8/kubernetes/schema/generator/model/TemplateContextTest.java index 8467ea4ffd..a6354af599 100644 --- a/kubernetes-model-generator/openapi/maven-plugin/src/test/java/io/fabric8/kubernetes/schema/generator/model/TemplateContextTest.java +++ b/kubernetes-model-generator/openapi/maven-plugin/src/test/java/io/fabric8/kubernetes/schema/generator/model/TemplateContextTest.java @@ -23,8 +23,6 @@ import java.io.File; import java.util.AbstractMap; -import java.util.Arrays; -import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -47,6 +45,7 @@ void setUp(@TempDir File tempDir) { .packageMapping( "io.k8s.api.core.v1", "io.fabric8.kubernetes.api.model") .packageMapping("io.k8s.apimachinery.pkg.apis.meta.v1", "io.fabric8.kubernetes.api.model") + .builderPackage("io.fabric8.kubernetes.api.builder") .build(); final Schema schema = (Schema) settings.getOpenAPI().getComponents().getSchemas().get("io.k8s.api.core.v1.Pod"); @@ -78,41 +77,41 @@ void packageName() { @Test void inRootPackage() { - assertTrue(templateContext.isInRootPackage()); + assertTrue(templateContext.getClassInformation().isInRootPackage()); } @Test void classSimpleName() { - assertEquals("Pod", templateContext.getClassSimpleName()); + assertEquals("Pod", templateContext.getClassInformation().getClassSimpleName()); } @Test void className() { - assertEquals("io.fabric8.kubernetes.api.model.Pod", templateContext.getClassName()); + assertEquals("io.fabric8.kubernetes.api.model.Pod", templateContext.getClassInformation().getClassName()); } @Test void hasMetadata() { - assertTrue(templateContext.isHasMetadata()); + assertTrue(templateContext.getClassInformation().isHasMetadata()); } @Test void hasMetadata_podSpec() { final Schema schema = (Schema) settings.getOpenAPI().getComponents().getSchemas().get("io.k8s.api.core.v1.PodSpec"); templateContext = new TemplateContext(settings, new AbstractMap.SimpleEntry<>("io.k8s.api.core.v1.PodSpec", schema)); - assertFalse(templateContext.isHasMetadata()); + assertFalse(templateContext.getClassInformation().isHasMetadata()); } @Test void kubernetesListType() { - assertNull(templateContext.getKubernetesListType()); + assertNull(templateContext.getClassInformation().getKubernetesListType()); } @Test void kubernetesListType_podList() { final Schema schema = (Schema) settings.getOpenAPI().getComponents().getSchemas().get("io.k8s.api.core.v1.PodList"); templateContext = new TemplateContext(settings, new AbstractMap.SimpleEntry<>("io.k8s.api.core.v1.PodList", schema)); - assertEquals("Pod", templateContext.getKubernetesListType()); + assertEquals("Pod", templateContext.getClassInformation().getKubernetesListType()); } @Test @@ -130,31 +129,38 @@ void put() { @Test void addImport() { templateContext.addImport("java.util.List"); - assertEquals(new HashSet<>(Collections.singletonList("java.util.List")), templateContext.getContext().get("imports")); + assertEquals(new HashSet<>(List.of( + "java.util.List", + "com.fasterxml.jackson.annotation.JsonIgnore", + "io.fabric8.kubernetes.api.builder.Editable")), templateContext.getContext().get("imports")); } @Test void addAllImports() { - templateContext.addAllImports(Arrays.asList("java.util.List", "java.util.Map")); - assertEquals(new HashSet<>(Arrays.asList("java.util.List", "java.util.Map")), templateContext.getContext().get("imports")); + templateContext.addAllImports(List.of("java.util.List", "java.util.Map")); + assertEquals(new HashSet<>(List.of( + "java.util.List", + "java.util.Map", + "com.fasterxml.jackson.annotation.JsonIgnore", + "io.fabric8.kubernetes.api.builder.Editable")), templateContext.getContext().get("imports")); } @Test void isNamespaced() { - assertTrue(templateContext.isNamespaced()); + assertTrue(templateContext.getClassInformation().isNamespaced()); } @Test void isNamespaced_node() { final Schema schema = (Schema) settings.getOpenAPI().getComponents().getSchemas().get("io.k8s.api.core.v1.Node"); templateContext = new TemplateContext(settings, new AbstractMap.SimpleEntry<>("io.k8s.api.core.v1.Node", schema)); - assertFalse(templateContext.isNamespaced()); + assertFalse(templateContext.getClassInformation().isNamespaced()); } @Test void isNamespaced_podSpec() { final Schema schema = (Schema) settings.getOpenAPI().getComponents().getSchemas().get("io.k8s.api.core.v1.PodSpec"); templateContext = new TemplateContext(settings, new AbstractMap.SimpleEntry<>("io.k8s.api.core.v1.PodSpec", schema)); - assertFalse(templateContext.isNamespaced()); + assertFalse(templateContext.getClassInformation().isNamespaced()); } }