This is an automated email from the ASF dual-hosted git repository.

pkarwasz pushed a commit to branch feat/135_native-types
in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git

commit c2af6176b879758151f4803b5e907041913aaab4
Author: Piotr P. Karwasz <pkarwasz-git...@apache.org>
AuthorDate: Thu May 29 10:08:43 2025 +0200

    log4j-docgen: Support boxed and native Java types in XSD generation
    
    Previously, `SchemaGenerator` did not handle configuration attributes with 
boxed types (e.g., `Integer`, `Boolean`), leading to their omission from the 
generated XSD schema.
    
    This update introduces:
    
    * Support for boxed Java types as configuration attributes.
    * Improved handling of other native Java types that map to XML built-in 
data types (e.g., `BigDecimal`, `URL`).
    
    These enhancements ensure that all relevant configuration attributes are 
accurately represented in the schema.
    
    Fixes: #135
---
 .../log4j/docgen/generator/SchemaGenerator.java    | 60 ++++++++++++----------
 .../SchemaGeneratorTest/expected-plugins.xsd       | 27 +++++++++-
 .../test/resources/SchemaGeneratorTest/plugins.xml | 25 +++++++++
 src/changelog/.0.x.x/135_native-types.xml          |  8 +++
 4 files changed, 91 insertions(+), 29 deletions(-)

diff --git 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
index e2874c3..707a606 100644
--- 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
+++ 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
@@ -16,15 +16,21 @@
  */
 package org.apache.logging.log4j.docgen.generator;
 
+import static java.util.Map.entry;
 import static java.util.Objects.requireNonNull;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.URI;
+import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -61,6 +67,27 @@ public final class SchemaGenerator {
 
     private static final String CHARSET_NAME = "UTF-8";
 
+    private static final Map<String, String> XML_BUILTIN_TYPES = Map.ofEntries(
+            entry(BigDecimal.class.getName(), "decimal"),
+            entry(BigInteger.class.getName(), "integer"),
+            entry(boolean.class.getName(), "boolean"),
+            entry(Boolean.class.getName(), "boolean"),
+            entry(byte.class.getName(), "byte"),
+            entry(Byte.class.getName(), "byte"),
+            entry(double.class.getName(), "double"),
+            entry(Double.class.getName(), "double"),
+            entry(float.class.getName(), "float"),
+            entry(Float.class.getName(), "float"),
+            entry(int.class.getName(), "int"),
+            entry(Integer.class.getName(), "int"),
+            entry(short.class.getName(), "short"),
+            entry(Short.class.getName(), "short"),
+            entry(String.class.getName(), "string"),
+            entry(long.class.getName(), "long"),
+            entry(Long.class.getName(), "long"),
+            entry(URI.class.getName(), "anyURI"),
+            entry(URL.class.getName(), "anyURI"));
+
     private SchemaGenerator() {}
 
     public static void generateSchema(final SchemaGeneratorArgs args) throws 
XMLStreamException {
@@ -137,19 +164,7 @@ public final class SchemaGenerator {
     }
 
     private static boolean isBuiltinXmlType(final String className) {
-        switch (className) {
-            case "boolean":
-            case "byte":
-            case "double":
-            case "float":
-            case "int":
-            case "short":
-            case "long":
-            case "java.lang.String":
-                return true;
-            default:
-                return false;
-        }
+        return XML_BUILTIN_TYPES.containsKey(className);
     }
 
     private static void writeScalarType(final ScalarType type, final 
XMLStreamWriter writer) throws XMLStreamException {
@@ -304,23 +319,12 @@ public final class SchemaGenerator {
 
     @Nullable
     private static String getXmlType(final TypeLookup lookup, final String 
className) {
-        switch (className) {
-            case "boolean":
-            case "byte":
-            case "double":
-            case "float":
-            case "int":
-            case "short":
-            case "long":
-                return className;
-            case "java.lang.String":
-                return "string";
+        final String builtinType = XML_BUILTIN_TYPES.get(className);
+        if (builtinType != null) {
+            return builtinType;
         }
         final ArtifactSourcedType type = lookup.get(className);
-        if (type != null) {
-            return LOG4J_PREFIX + ":" + className;
-        }
-        return null;
+        return type != null ? LOG4J_PREFIX + ":" + className : null;
     }
 
     private static void writeMultiplicity(
diff --git 
a/log4j-docgen/src/test/resources/SchemaGeneratorTest/expected-plugins.xsd 
b/log4j-docgen/src/test/resources/SchemaGeneratorTest/expected-plugins.xsd
index ee0d568..4cd4cb3 100644
--- a/log4j-docgen/src/test/resources/SchemaGeneratorTest/expected-plugins.xsd
+++ b/log4j-docgen/src/test/resources/SchemaGeneratorTest/expected-plugins.xsd
@@ -19,7 +19,8 @@
   ~ This is a test schema used in `SchemaGeneratorTest`.
   ~ Unlike this file the `SchemaGenerator` strips whitespace.
   -->
-<schema xmlns="http://www.w3.org/2001/XMLSchema"; 
xmlns:log4j="https://logging.apache.org/xml/ns"; elementFormDefault="qualified" 
targetNamespace="https://logging.apache.org/xml/ns"; version="1.2.3">
+<schema xmlns="http://www.w3.org/2001/XMLSchema"; 
xmlns:log4j="https://logging.apache.org/xml/ns";
+        elementFormDefault="qualified" 
targetNamespace="https://logging.apache.org/xml/ns"; version="1.2.3">
   <element type="log4j:org.apache.logging.log4j.core.config.Configuration" 
name="Configuration"/>
   <simpleType name="org.apache.logging.log4j.Level">
     <annotation>
@@ -500,4 +501,28 @@ A conversion pattern is composed of literal text and 
format control expressions
       </annotation>
     </attribute>
   </complexType>
+  <complexType name="org.apache.logging.log4j.dummy.AllTypesPlugin">
+    <annotation>
+      <documentation>Dummy plugin to test all types of builtin XML 
attributes.</documentation>
+    </annotation>
+    <attribute name="BigInteger" type="integer"/>
+    <attribute name="BigDecimal" type="decimal"/>
+    <attribute name="boolean" type="boolean"/>
+    <attribute name="Boolean" type="boolean"/>
+    <attribute name="byte" type="byte"/>
+    <attribute name="Byte" type="byte"/>
+    <attribute name="double" type="double"/>
+    <attribute name="Double" type="double"/>
+    <attribute name="float" type="float"/>
+    <attribute name="Float" type="float"/>
+    <attribute name="int" type="int"/>
+    <attribute name="Integer" type="int"/>
+    <attribute name="long" type="long"/>
+    <attribute name="Long" type="long"/>
+    <attribute name="short" type="short"/>
+    <attribute name="Short" type="short"/>
+    <attribute name="String" type="string"/>
+    <attribute name="URI" type="anyURI"/>
+    <attribute name="URL" type="anyURI"/>
+  </complexType>
 </schema>
\ No newline at end of file
diff --git a/log4j-docgen/src/test/resources/SchemaGeneratorTest/plugins.xml 
b/log4j-docgen/src/test/resources/SchemaGeneratorTest/plugins.xml
index b610c00..2f6f696 100644
--- a/log4j-docgen/src/test/resources/SchemaGeneratorTest/plugins.xml
+++ b/log4j-docgen/src/test/resources/SchemaGeneratorTest/plugins.xml
@@ -267,6 +267,31 @@ A conversion pattern is composed of literal text and 
format control expressions
                 </attribute>
             </attributes>
         </plugin>
+
+        <plugin name="AllTypes" 
className="org.apache.logging.log4j.dummy.AllTypesPlugin">
+            <description>Dummy plugin to test all types of builtin XML 
attributes.</description>
+            <attributes>
+                <attribute name="BigInteger" type="java.math.BigInteger"/>
+                <attribute name="BigDecimal" type="java.math.BigDecimal"/>
+                <attribute name="boolean" type="boolean"/>
+                <attribute name="Boolean" type="java.lang.Boolean"/>
+                <attribute name="byte" type="byte"/>
+                <attribute name="Byte" type="java.lang.Byte"/>
+                <attribute name="double" type="double"/>
+                <attribute name="Double" type="java.lang.Double"/>
+                <attribute name="float" type="float"/>
+                <attribute name="Float" type="java.lang.Float"/>
+                <attribute name="int" type="int"/>
+                <attribute name="Integer" type="java.lang.Integer"/>
+                <attribute name="long" type="long"/>
+                <attribute name="Long" type="java.lang.Long"/>
+                <attribute name="short" type="short"/>
+                <attribute name="Short" type="java.lang.Short"/>
+                <attribute name="String" type="java.lang.String"/>
+                <attribute name="URI" type="java.net.URI"/>
+                <attribute name="URL" type="java.net.URL"/>
+            </attributes>
+        </plugin>
     </plugins>
 
     <abstractTypes>
diff --git a/src/changelog/.0.x.x/135_native-types.xml 
b/src/changelog/.0.x.x/135_native-types.xml
new file mode 100644
index 0000000..5b4d83f
--- /dev/null
+++ b/src/changelog/.0.x.x/135_native-types.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xmlns="https://logging.apache.org/xml/ns";
+       xsi:schemaLocation="https://logging.apache.org/xml/ns 
https://logging.apache.org/xml/ns/log4j-changelog-0.xsd";
+       type="fixed">
+  <issue id="135" 
link="https://github.com/apache/logging-log4j-tools/issues/135"/>
+  <description format="asciidoc">Fix support of boxed and native Java types in 
XSD generation.</description>
+</entry>

Reply via email to