diff --git a/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java b/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java index 37f174af55..61b82be03a 100644 --- a/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java +++ b/annot/src/main/java/com/predic8/membrane/annot/generator/kubernetes/model/SchemaObject.java @@ -14,6 +14,7 @@ package com.predic8.membrane.annot.generator.kubernetes.model; import com.fasterxml.jackson.databind.node.*; +import org.jetbrains.annotations.NotNull; import java.util.*; @@ -148,11 +149,22 @@ private void addProperties(ObjectNode node) { private static ObjectNode createPropertyNode(AbstractSchema property) { ObjectNode propertyNode = property.json(jnf.objectNode()); if (property.getEnumValues() != null && !property.getEnumValues().isEmpty()) { - propertyNode.set("enum", getEnumNode(property)); + propertyNode = createEnumNode(property, propertyNode); } return propertyNode; } + private static @NotNull ObjectNode createEnumNode(AbstractSchema property, ObjectNode propertyNode) { + ObjectNode unlimitedNode = propertyNode.deepCopy(); // a string (unrestricted) + ObjectNode limitedNode = propertyNode; // a string restricted by 'enum' + limitedNode.set("enum", getEnumNode(property)); + propertyNode = jnf.objectNode(); + // The 'anyOf' construction will suggest the pre-defined enum values (lowercase enum values) but allow other + // spellings. + propertyNode.set("anyOf", jnf.arrayNode().add(limitedNode).add(unlimitedNode)); + return propertyNode; + } + private static ArrayNode getEnumNode(AbstractSchema property) { var enumValues = jnf.arrayNode(); property.getEnumValues().forEach(enumValues::add); diff --git a/annot/src/test/java/com/predic8/membrane/annot/SpringEnumParsingTest.java b/annot/src/test/java/com/predic8/membrane/annot/SpringEnumParsingTest.java new file mode 100644 index 0000000000..458c8ee241 --- /dev/null +++ b/annot/src/test/java/com/predic8/membrane/annot/SpringEnumParsingTest.java @@ -0,0 +1,53 @@ +package com.predic8.membrane.annot; + +import com.predic8.membrane.annot.beanregistry.BeanRegistry; +import com.predic8.membrane.annot.util.CompilerHelper; +import com.predic8.membrane.annot.util.CompilerResult; +import org.junit.jupiter.api.Test; + +import static com.predic8.membrane.annot.SpringConfigurationXSDGeneratingAnnotationProcessorTest.MC_MAIN_DEMO; +import static com.predic8.membrane.annot.util.CompilerHelper.*; +import static com.predic8.membrane.annot.util.StructureAssertionUtil.*; + +public class SpringEnumParsingTest { + + private static final String TRIVIAL_ENUM_EXAMPLE = """ + package com.predic8.membrane.demo; + import com.predic8.membrane.annot.*; + import java.util.List; + @MCElement(name="root") + public class DemoElement { + MyEnum value; + + public MyEnum getValue() { return value; } + @MCAttribute + public void setValue(MyEnum value) { this.value = value; } + } + --- + package com.predic8.membrane.demo; + public enum MyEnum { + VALUE1, VALUE2; + } + """; + + @Test + public void checkEnumParsing() { + var sources = splitSources(MC_MAIN_DEMO + TRIVIAL_ENUM_EXAMPLE); + var result = CompilerHelper.compile(sources, false); + assertCompilerResult(true, result); + + assertThatXMLValueWasTranslatedTo(result, "VALUE1", "VALUE1"); + assertThatXMLValueWasTranslatedTo(result, "value1", "VALUE1"); + } + + private static void assertThatXMLValueWasTranslatedTo(CompilerResult result, String xmlValue, String expectedToStringValue) { + BeanRegistry br = parseXML(result, SpringParsingTest.wrapSpring(""" + """.formatted(xmlValue))); + + assertStructure( + br, + clazz("DemoElement", + property("value", convertedToString(expectedToStringValue)))); + } + +} diff --git a/annot/src/test/java/com/predic8/membrane/annot/ParsingTest.java b/annot/src/test/java/com/predic8/membrane/annot/SpringParsingTest.java similarity index 98% rename from annot/src/test/java/com/predic8/membrane/annot/ParsingTest.java rename to annot/src/test/java/com/predic8/membrane/annot/SpringParsingTest.java index ba3e92d850..be04d24cd4 100644 --- a/annot/src/test/java/com/predic8/membrane/annot/ParsingTest.java +++ b/annot/src/test/java/com/predic8/membrane/annot/SpringParsingTest.java @@ -17,7 +17,6 @@ import com.predic8.membrane.annot.beanregistry.BeanRegistry; import com.predic8.membrane.annot.beanregistry.SpringContextAdapter; import com.predic8.membrane.annot.util.CompilerHelper; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.ConfigurableApplicationContext; @@ -28,9 +27,9 @@ import static com.predic8.membrane.annot.util.StructureAssertionUtil.*; import static com.predic8.membrane.annot.util.StructureAssertionUtil.clazz; -public class ParsingTest { +public class SpringParsingTest { - private String wrapSpring(String content) { + public static String wrapSpring(String content) { return """ Assertions.assertEquals(value, bean); } + public static Asserter isNull() { + return bean -> Assertions.assertNull(bean); + } + + public static Asserter convertedToString(String value) { + return bean -> Assertions.assertEquals(value, bean.toString()); + } + public static Asserter list(Asserter... asserters) { return bean -> { assertInstanceOf(List.class, bean);