You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2025/05/29 08:08:59 UTC
(logging-log4j-tools) branch feat/135_native-types created (now c2af617)
This is an automated email from the ASF dual-hosted git repository.
pkarwasz pushed a change to branch feat/135_native-types
in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git
at c2af617 log4j-docgen: Support boxed and native Java types in XSD generation
This branch includes the following new commits:
new c2af617 log4j-docgen: Support boxed and native Java types in XSD generation
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(logging-log4j-tools) 01/01: log4j-docgen: Support boxed and native Java types in XSD generation
Posted by pk...@apache.org.
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 <pk...@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>