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

vy pushed a commit to branch release/2.25.3
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 78dc01d8a590c4d4a998e280ab06a325cd6938d6
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Mon Dec 15 10:56:58 2025 +0100

    Use binary names in `GraalVmProcessor` (#3996)
    
    * Use binary names in `GraalVmProcessor`
    
    `GraalVmProcessor` currently emits canonical type names (JLS §6.7) for 
parameter types in the GraalVM reachability metadata.
    However, testing shows that GraalVM expects **binary names** (JLS §13.1) 
for reference types. For example:
    
    * Canonical: `org.apache.logging.log4j.core.Filter.Result`
    * Required (binary): `org.apache.logging.log4j.core.Filter$Result`
    
    For array types, GraalVM accepts two forms:
    
    * The JVM descriptor form: `[L<component_type>;`
    * The Java-like form: `<component_type>[]`
    
    This PR updates the processor to use binary names and emits the simpler 
Java-like syntax for arrays.
    
    * Fix changelog entry type
    
    ---------
    
    Co-authored-by: Volkan Yazıcı <[email protected]>
---
 .../plugins/processor/GraalVmProcessorTest.java    |  8 ++++--
 .../GraalVmProcessorTest/java/FakePlugin.java      | 11 +++++++-
 .../config/plugins/processor/GraalVmProcessor.java | 32 ++--------------------
 src/changelog/.2.x.x/3871_graalvm_binary_name.xml  | 13 +++++++++
 4 files changed, 32 insertions(+), 32 deletions(-)

diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessorTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessorTest.java
index 957bb3228c..4605fcb70b 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessorTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessorTest.java
@@ -79,7 +79,9 @@ class GraalVmProcessorTest {
                                     
"org.apache.logging.log4j.core.config.Configuration",
                                     
"org.apache.logging.log4j.core.config.Node",
                                     
"org.apache.logging.log4j.core.LoggerContext",
-                                    "java.lang.String"))),
+                                    "java.lang.String",
+                                    
"org.apache.logging.log4j.core.Filter$Result",
+                                    
"org.apache.logging.log4j.core.Filter[]"))),
             "fields",
             emptyList());
     private static final String FAKE_PLUGIN_BUILDER_NAME = FAKE_PLUGIN_NAME + 
"$Builder";
@@ -93,9 +95,11 @@ class GraalVmProcessorTest {
                     asMap("name", "attribute"),
                     asMap("name", 
"attributeWithoutPublicSetterButWithSuppressAnnotation"),
                     asMap("name", "config"),
+                    asMap("name", "filters"),
                     asMap("name", "layout"),
                     asMap("name", "loggerContext"),
                     asMap("name", "node"),
+                    asMap("name", "onMatch"),
                     asMap("name", "value")));
     private static final String FAKE_PLUGIN_NESTED_NAME = FAKE_PLUGIN_NAME + 
"$Nested";
     private static final Object FAKE_PLUGIN_NESTED = 
onlyNoArgsConstructor(FAKE_PLUGIN_NESTED_NAME);
@@ -229,7 +233,7 @@ class GraalVmProcessorTest {
         }
         // The generated folder name should be deterministic and based solely 
on the descriptor content.
         // If the descriptor changes, this test and the expected folder name 
must be updated accordingly.
-        
assertThat(reachabilityMetadataFolders).hasSize(1).containsExactly(path.resolve("72c240aa"));
+        
assertThat(reachabilityMetadataFolders).hasSize(1).containsExactly(path.resolve("791e18c8"));
         
assertThat(reachabilityMetadataFolders.get(0).resolve("reflect-config.json"))
                 .as("Reachability metadata file")
                 .exists();
diff --git 
a/log4j-core-test/src/test/resources/GraalVmProcessorTest/java/FakePlugin.java 
b/log4j-core-test/src/test/resources/GraalVmProcessorTest/java/FakePlugin.java
index 90b872c0a3..40728b0fc5 100644
--- 
a/log4j-core-test/src/test/resources/GraalVmProcessorTest/java/FakePlugin.java
+++ 
b/log4j-core-test/src/test/resources/GraalVmProcessorTest/java/FakePlugin.java
@@ -17,6 +17,7 @@
 package example;
 
 import java.io.Serializable;
+import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.Configuration;
@@ -49,7 +50,9 @@ public class FakePlugin {
             @PluginConfiguration Configuration config,
             @PluginNode Node node,
             @PluginLoggerContext LoggerContext loggerContext,
-            @PluginValue("value") String value) {
+            @PluginValue("value") String value,
+            @PluginValue("onMatch") Filter.Result onMatch,
+            @PluginElement("filters") Filter[] filters) {
         return null;
     }
 
@@ -82,6 +85,12 @@ public class FakePlugin {
         @PluginValue("value")
         private String value;
 
+        @PluginValue("onMatch")
+        private Filter.Result onMatch;
+
+        @PluginElement("filters")
+        private Filter[] filters;
+
         @Override
         public FakePlugin build() {
             return null;
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessor.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessor.java
index a5ba7ba61c..4603ec5ee9 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessor.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/processor/GraalVmProcessor.java
@@ -36,16 +36,13 @@ import javax.annotation.processing.SupportedAnnotationTypes;
 import javax.annotation.processing.SupportedOptions;
 import javax.lang.model.SourceVersion;
 import javax.lang.model.element.Element;
-import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.Modifier;
-import javax.lang.model.element.PackageElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.ArrayType;
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.TypeMirror;
-import javax.lang.model.util.SimpleElementVisitor8;
 import javax.lang.model.util.SimpleTypeVisitor8;
 import javax.tools.Diagnostic;
 import javax.tools.StandardLocation;
@@ -300,9 +297,7 @@ public class GraalVmProcessor extends AbstractProcessor {
 
                     @Override
                     public @Nullable String visitDeclared(final DeclaredType 
t, final Void unused) {
-                        return safeCast(t.asElement(), TypeElement.class)
-                                .getQualifiedName()
-                                .toString();
+                        return 
GraalVmProcessor.this.toString(safeCast(t.asElement(), TypeElement.class));
                     }
                 },
                 null);
@@ -313,28 +308,7 @@ public class GraalVmProcessor extends AbstractProcessor {
      *
      * @param element A Java language element.
      */
-    private String toString(Element element) {
-        return element.accept(
-                new SimpleElementVisitor8<String, @Nullable Void>() {
-                    @Override
-                    public String visitPackage(PackageElement e, @Nullable 
Void unused) {
-                        return e.getQualifiedName().toString();
-                    }
-
-                    @Override
-                    public String visitType(TypeElement e, @Nullable Void 
unused) {
-                        Element parent = e.getEnclosingElement();
-                        String separator = parent.getKind() == 
ElementKind.PACKAGE ? "." : "$";
-                        return visit(parent, unused)
-                                + separator
-                                + e.getSimpleName().toString();
-                    }
-
-                    @Override
-                    protected String defaultAction(Element e, @Nullable Void 
unused) {
-                        return "";
-                    }
-                },
-                null);
+    private String toString(TypeElement element) {
+        return 
processingEnv.getElementUtils().getBinaryName(element).toString();
     }
 }
diff --git a/src/changelog/.2.x.x/3871_graalvm_binary_name.xml 
b/src/changelog/.2.x.x/3871_graalvm_binary_name.xml
new file mode 100644
index 0000000000..a6a5e8c257
--- /dev/null
+++ b/src/changelog/.2.x.x/3871_graalvm_binary_name.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns="https://logging.apache.org/xml/ns";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="
+           https://logging.apache.org/xml/ns
+           https://logging.apache.org/xml/ns/log4j-changelog-0.xsd";
+       type="fixed">
+    <issue id="3871" 
link="https://github.com/apache/logging-log4j2/issues/3871"/>
+    <issue id="3996" 
link="https://github.com/apache/logging-log4j2/pull/3996"/>
+    <description format="asciidoc">
+        Fix GraalVM metadata for nested classes to use binary names instead of 
canonical names.
+    </description>
+</entry>

Reply via email to