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

Arsnael pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 0fd97a477b59f0a98d4f4cbf8c0f75e09e8fd710
Author: Benoit TELLIER <[email protected]>
AuthorDate: Thu Apr 23 15:38:35 2026 +0200

    [ENHANCEMENT] LeakAware: explicit resource naming to enhance auditability
---
 .../james/mailbox/store/mail/model/impl/MessageParser.java   |  2 +-
 .../james/server/core/MimeMessageInputStreamSource.java      |  2 +-
 .../main/java/org/apache/james/lifecycle/api/Disposable.java | 12 +++++++++---
 .../java/org/apache/james/lifecycle/api/LeakAwareTest.java   |  2 +-
 .../james/imapserver/netty/ImapRequestFrameDecoder.java      |  2 +-
 5 files changed, 13 insertions(+), 7 deletions(-)

diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
index 99644ce0e7..6918c0d69b 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
@@ -36,7 +36,7 @@ public interface MessageParser {
             private final List<ParsedAttachment> attachments;
 
             Resource(List<ParsedAttachment> attachments, Disposable cleanup) {
-                super(cleanup);
+                super("MessageParser.ParsingResult", cleanup);
                 this.attachments = attachments;
             }
         }
diff --git 
a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java
 
b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java
index 31393a99a5..6517392b66 100644
--- 
a/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java
+++ 
b/server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java
@@ -69,7 +69,7 @@ public class MimeMessageInputStreamSource extends 
Disposable.LeakAware<MimeMessa
         private final Set<InputStream> streams;
 
         Resource(BufferedDeferredFileOutputStream out, Set<InputStream> 
streams) {
-            super(() -> {
+            super("MimeMessageInputStreamSource", () -> {
                 // explicit close all streams
                 for (InputStream stream : streams) {
                     try {
diff --git 
a/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java
 
b/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java
index 68da201d4b..1363ca941f 100644
--- 
a/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java
+++ 
b/server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java
@@ -46,8 +46,10 @@ public interface Disposable {
         public static class Resource implements Disposable {
             private final AtomicBoolean isDisposed = new AtomicBoolean(false);
             private final Disposable cleanup;
+            private final String name;
 
-            public Resource(Disposable cleanup) {
+            public Resource(String name, Disposable cleanup) {
+                this.name = name;
                 this.cleanup = cleanup;
             }
 
@@ -169,6 +171,10 @@ public interface Disposable {
             }
         }
 
+        private String resourceName() {
+            return resource.name + "@" + 
Integer.toHexString(System.identityHashCode(resource));
+        }
+
         public void detectLeak() {
             switch (LeakAware.LEVEL) {
                 case NONE: // nothing
@@ -194,11 +200,11 @@ public interface Disposable {
         public void errorLog() {
             if (LeakAware.tracedEnabled()) {
                 LOGGER.error("Leak detected! Resource {} was not released 
before its referent was garbage-collected. \n" +
-                    "This resource was instanced at: \n{}", resource, 
traceRecord.toString());
+                    "This resource was instanced at: \n{}", resourceName(), 
traceRecord.toString());
             } else {
                 LOGGER.error("Leak detected! Resource {} was not released 
before its referent was garbage-collected. \n" +
                     "Resource management needs to be reviewed: ensure to 
always call dispose() for disposable objects you work with. \n" +
-                    "Consider enabling advanced leak detection to further 
identify the problem.", resource);
+                    "Consider enabling advanced leak detection to further 
identify the problem.", resourceName());
             }
         }
 
diff --git 
a/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java
 
b/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java
index bc5ddb0a1d..bd357cf60a 100644
--- 
a/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java
+++ 
b/server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java
@@ -44,7 +44,7 @@ class LeakAwareTest {
     private static final class LeakResourceSample extends 
LeakAware<LeakResourceSample.TestResource> {
         static class TestResource extends LeakAware.Resource {
             public TestResource(Disposable cleanup) {
-                super(cleanup);
+                super("LeakAwareTest.TestResource", cleanup);
             }
         }
 
diff --git 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
index 14cb8aae92..1a658c4a86 100644
--- 
a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
+++ 
b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
@@ -329,7 +329,7 @@ public class ImapRequestFrameDecoder extends 
ByteToMessageDecoder implements Net
         private final File file;
 
         private FileHolderInner(File file) {
-            super(() -> FileUtils.deleteQuietly(file));
+            super("ImapRequestFrameDecoder.FileHolder", () -> 
FileUtils.deleteQuietly(file));
             this.file = file;
         }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to