From 8c742d5ed8ee3701e17d93dca81056f0a384498a Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Fri, 6 Feb 2026 16:12:09 +0530 Subject: [PATCH 1/5] Support NMTOKENS as built in type --- .../src/main/java/io/ballerina/xsd/core/visitor/Utils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java b/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java index 3dfcff3..057135b 100644 --- a/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java +++ b/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java @@ -104,6 +104,7 @@ public final class Utils { private static final String WHITESPACE_PATTERN = "\\s"; private static final String SPECIAL_CHARS_PATTERN = "[!@$%^&*()_\\-|]"; public static final String NMTOKEN = "NMTOKEN"; + public static final String NMTOKENS = "NMTOKENS"; public static final String IDREF = "IDREF"; public static final String IDREFS = "IDREFS"; public static final String ANYDATA = "anydata"; @@ -187,7 +188,7 @@ public static String deriveType(Node node) { public static String typeGenerator(String typeName) { switch (typeName) { case TIME, DATE_TIME, DATE, G_YEAR_MONTH, G_YEAR, STRING, LANGUAGE, - DURATION, ANY_URI, G_MONTH_DAY, NMTOKEN, IDREF, IDREFS, G_DAY, G_MONTH, NORMALIZED_STRING, + DURATION, ANY_URI, G_MONTH_DAY, NMTOKEN, NMTOKENS, IDREF, IDREFS, G_DAY, G_MONTH, NORMALIZED_STRING, TOKEN, NCNAME, QNAME, NOTATION, BASE64_BINARY, HEX_BINARY, BYTE, ID -> { return STRING; } From fd909912dc0ab88ef4258aabd7a789daf5062dba Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Fri, 6 Feb 2026 17:11:51 +0530 Subject: [PATCH 2/5] [Automated] Update the native jar versions --- module-ballerina-xsd/BalTool.toml | 4 ++-- module-ballerina-xsd/Ballerina.toml | 2 +- module-ballerina-xsd/Dependencies.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module-ballerina-xsd/BalTool.toml b/module-ballerina-xsd/BalTool.toml index b6d2819..4fe9db3 100644 --- a/module-ballerina-xsd/BalTool.toml +++ b/module-ballerina-xsd/BalTool.toml @@ -2,8 +2,8 @@ id = "xsd" [[dependency]] -path = "../xsd-cli/build/libs/xsd-cli-1.2.0.jar" +path = "../xsd-cli/build/libs/xsd-cli-1.2.1-SNAPSHOT.jar" [[dependency]] -path = "../xsd-core/build/libs/xsd-core-1.2.0.jar" +path = "../xsd-core/build/libs/xsd-core-1.2.1-SNAPSHOT.jar" diff --git a/module-ballerina-xsd/Ballerina.toml b/module-ballerina-xsd/Ballerina.toml index f4e8f3f..ce5daf4 100644 --- a/module-ballerina-xsd/Ballerina.toml +++ b/module-ballerina-xsd/Ballerina.toml @@ -2,7 +2,7 @@ distribution = "2201.11.0" org = "ballerina" name = "xsdtool" -version = "1.2.0" +version = "1.2.1" authors = ["Ballerina"] keywords = ["xsd", "xsd-tool"] repository = "https://github.com/ballerina-platform/xsd-tools" diff --git a/module-ballerina-xsd/Dependencies.toml b/module-ballerina-xsd/Dependencies.toml index bbf96bc..25cb719 100644 --- a/module-ballerina-xsd/Dependencies.toml +++ b/module-ballerina-xsd/Dependencies.toml @@ -10,7 +10,7 @@ distribution-version = "2201.11.0" [[package]] org = "ballerina" name = "xsdtool" -version = "1.2.0" +version = "1.2.1" modules = [ {org = "ballerina", packageName = "xsdtool", moduleName = "xsdtool"} ] From 5687fd1750197ba8a3fc63a0e329b3de35d8f022 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Fri, 6 Feb 2026 17:15:07 +0530 Subject: [PATCH 3/5] Include missing built-in types --- .../java/io/ballerina/xsd/core/visitor/Utils.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java b/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java index 057135b..6c875d6 100644 --- a/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java +++ b/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java @@ -105,6 +105,9 @@ public final class Utils { private static final String SPECIAL_CHARS_PATTERN = "[!@$%^&*()_\\-|]"; public static final String NMTOKEN = "NMTOKEN"; public static final String NMTOKENS = "NMTOKENS"; + public static final String ENTITY = "ENTITY"; + public static final String ENTITIES = "ENTITIES"; + public static final String NAME = "Name"; public static final String IDREF = "IDREF"; public static final String IDREFS = "IDREFS"; public static final String ANYDATA = "anydata"; @@ -187,9 +190,9 @@ public static String deriveType(Node node) { public static String typeGenerator(String typeName) { switch (typeName) { - case TIME, DATE_TIME, DATE, G_YEAR_MONTH, G_YEAR, STRING, LANGUAGE, - DURATION, ANY_URI, G_MONTH_DAY, NMTOKEN, NMTOKENS, IDREF, IDREFS, G_DAY, G_MONTH, NORMALIZED_STRING, - TOKEN, NCNAME, QNAME, NOTATION, BASE64_BINARY, HEX_BINARY, BYTE, ID -> { + case TIME, DATE_TIME, DATE, G_YEAR_MONTH, G_YEAR, STRING, LANGUAGE, DURATION, ANY_URI, G_MONTH_DAY, + NMTOKEN, NMTOKENS, IDREF, IDREFS, G_DAY, G_MONTH, NORMALIZED_STRING, TOKEN, NCNAME, QNAME, + NOTATION, BASE64_BINARY, HEX_BINARY, BYTE, ID, URI, NAME, ENTITY, ENTITIES -> { return STRING; } case INTEGER, LONG, NEGATIVE_INTEGER, NON_POSITIVE_INTEGER, POSITIVE_INTEGER, SHORT, @@ -219,8 +222,10 @@ public static boolean isSimpleType(String type) { String[] simpleTypes = { TIME, DATE_TIME, DATE, G_YEAR_MONTH, G_YEAR, STRING, LANGUAGE, DURATION, INTEGER, LONG, NEGATIVE_INTEGER, NON_POSITIVE_INTEGER, POSITIVE_INTEGER, SHORT, - UNSIGNED_LONG, UNSIGNED_INT, UNSIGNED_SHORT, - UNSIGNED_BYTE, INT, BASE64_BINARY, BOOLEAN, FLOAT, DOUBLE, DECIMAL, ANY_URI, NON_NEGATIVE_INTEGER + UNSIGNED_LONG, UNSIGNED_INT, UNSIGNED_SHORT, UNSIGNED_BYTE, INT, BASE64_BINARY, + BOOLEAN, FLOAT, DOUBLE, DECIMAL, ANY_URI, NON_NEGATIVE_INTEGER, G_MONTH_DAY, G_DAY, + G_MONTH, NORMALIZED_STRING, TOKEN, NCNAME, QNAME, NOTATION, NMTOKEN, NMTOKENS, + IDREF, IDREFS, ID, HEX_BINARY, BYTE, URI, NAME, ENTITY, ENTITIES }; return Arrays.stream(simpleTypes).toList().contains(typeName); } From 10028e231a54c79332cfae622c5e22aa6b0b4bf6 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Wed, 18 Feb 2026 00:11:13 +0530 Subject: [PATCH 4/5] Validate new built-in types --- .../ballerina/xsd/core/XSDToRecordTest.java | 4 +++- .../44_elements_with_builtin_string_types.bal | 21 +++++++++++++++++++ .../44_elements_with_builtin_string_types.xsd | 6 ++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 xsd-core/src/test/resources/expected/44_elements_with_builtin_string_types.bal create mode 100644 xsd-core/src/test/resources/xml/44_elements_with_builtin_string_types.xsd diff --git a/xsd-core/src/test/java/io/ballerina/xsd/core/XSDToRecordTest.java b/xsd-core/src/test/java/io/ballerina/xsd/core/XSDToRecordTest.java index 517a2dd..88c1c9a 100644 --- a/xsd-core/src/test/java/io/ballerina/xsd/core/XSDToRecordTest.java +++ b/xsd-core/src/test/java/io/ballerina/xsd/core/XSDToRecordTest.java @@ -86,7 +86,9 @@ private static Stream provideTestPaths() { "41_elements_with_attribute_group.bal"}, new Object[] {new String[] {"42_elements_with_any.xsd"}, "42_elements_with_any.bal"}, new Object[] {new String[] {"43_elements_with_include_base.xsd", "43_elements_with_include.xsd"}, - "43_elements_with_include.bal"} + "43_elements_with_include.bal"}, + new Object[] {new String[] {"44_elements_with_builtin_string_types.xsd"}, + "44_elements_with_builtin_string_types.bal"} ); } diff --git a/xsd-core/src/test/resources/expected/44_elements_with_builtin_string_types.bal b/xsd-core/src/test/resources/expected/44_elements_with_builtin_string_types.bal new file mode 100644 index 0000000..95a8046 --- /dev/null +++ b/xsd-core/src/test/resources/expected/44_elements_with_builtin_string_types.bal @@ -0,0 +1,21 @@ +import ballerina/data.xmldata; + +@xmldata:Namespace {uri: "http://namespace.org/"} +public type TokenList record {| + string \#content; +|}; + +@xmldata:Namespace {uri: "http://namespace.org/"} +public type EntityRef record {| + string \#content; +|}; + +@xmldata:Namespace {uri: "http://namespace.org/"} +public type EntityRefs record {| + string \#content; +|}; + +@xmldata:Namespace {uri: "http://namespace.org/"} +public type NameVal record {| + string \#content; +|}; diff --git a/xsd-core/src/test/resources/xml/44_elements_with_builtin_string_types.xsd b/xsd-core/src/test/resources/xml/44_elements_with_builtin_string_types.xsd new file mode 100644 index 0000000..6a9ff9d --- /dev/null +++ b/xsd-core/src/test/resources/xml/44_elements_with_builtin_string_types.xsd @@ -0,0 +1,6 @@ + + + + + + From 0e51d264f1b842fc2e44bb9e6ed1ef9b1ae7bdad Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Wed, 18 Feb 2026 00:21:49 +0530 Subject: [PATCH 5/5] Apply review suggestions --- .../io/ballerina/xsd/core/visitor/Utils.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java b/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java index 6c875d6..35a4229 100644 --- a/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java +++ b/xsd-core/src/main/java/io/ballerina/xsd/core/visitor/Utils.java @@ -114,6 +114,14 @@ public final class Utils { public static final String ANY_TYPE = "anyType"; public static final String ANY_SIMPLE_TYPE = "anySimpleType"; public static final String ANY_ATOMIC_TYPE = "anyAtomicType"; + private static final Set SIMPLE_TYPES = Set.of( + TIME, DATE_TIME, DATE, G_YEAR_MONTH, G_YEAR, STRING, LANGUAGE, DURATION, + INTEGER, LONG, NEGATIVE_INTEGER, NON_POSITIVE_INTEGER, POSITIVE_INTEGER, SHORT, + UNSIGNED_LONG, UNSIGNED_INT, UNSIGNED_SHORT, UNSIGNED_BYTE, INT, BASE64_BINARY, + BOOLEAN, FLOAT, DOUBLE, DECIMAL, ANY_URI, NON_NEGATIVE_INTEGER, G_MONTH_DAY, G_DAY, + G_MONTH, NORMALIZED_STRING, TOKEN, NCNAME, QNAME, NOTATION, NMTOKEN, NMTOKENS, + IDREF, IDREFS, ID, HEX_BINARY, BYTE, NAME, ENTITY, ENTITIES + ); public static String addNamespace(XSDVisitorImpl xsdVisitor, String namespace) { if (Objects.equals(namespace, EMPTY_STRING)) { @@ -192,7 +200,7 @@ public static String typeGenerator(String typeName) { switch (typeName) { case TIME, DATE_TIME, DATE, G_YEAR_MONTH, G_YEAR, STRING, LANGUAGE, DURATION, ANY_URI, G_MONTH_DAY, NMTOKEN, NMTOKENS, IDREF, IDREFS, G_DAY, G_MONTH, NORMALIZED_STRING, TOKEN, NCNAME, QNAME, - NOTATION, BASE64_BINARY, HEX_BINARY, BYTE, ID, URI, NAME, ENTITY, ENTITIES -> { + NOTATION, BASE64_BINARY, HEX_BINARY, BYTE, ID, NAME, ENTITY, ENTITIES -> { return STRING; } case INTEGER, LONG, NEGATIVE_INTEGER, NON_POSITIVE_INTEGER, POSITIVE_INTEGER, SHORT, @@ -219,15 +227,7 @@ public static String typeGenerator(String typeName) { public static boolean isSimpleType(String type) { String typeName = type.contains(COLON) ? type.substring(type.indexOf(COLON) + 1) : type; - String[] simpleTypes = { - TIME, DATE_TIME, DATE, G_YEAR_MONTH, G_YEAR, STRING, LANGUAGE, DURATION, - INTEGER, LONG, NEGATIVE_INTEGER, NON_POSITIVE_INTEGER, POSITIVE_INTEGER, SHORT, - UNSIGNED_LONG, UNSIGNED_INT, UNSIGNED_SHORT, UNSIGNED_BYTE, INT, BASE64_BINARY, - BOOLEAN, FLOAT, DOUBLE, DECIMAL, ANY_URI, NON_NEGATIVE_INTEGER, G_MONTH_DAY, G_DAY, - G_MONTH, NORMALIZED_STRING, TOKEN, NCNAME, QNAME, NOTATION, NMTOKEN, NMTOKENS, - IDREF, IDREFS, ID, HEX_BINARY, BYTE, URI, NAME, ENTITY, ENTITIES - }; - return Arrays.stream(simpleTypes).toList().contains(typeName); + return SIMPLE_TYPES.contains(typeName); } public static Iterable asIterable(NodeList nodeList) {