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

rcordier pushed a commit to branch npe-get-raw
in repository https://gitbox.apache.org/repos/asf/james-mime4j.git

commit 9f6d13f9ed1ec07bb98ac90487d902c60779f245
Author: Rene Cordier <rcord...@linagora.com>
AuthorDate: Thu Aug 28 11:59:05 2025 +0700

    Introducing a getSafeRaw() method in RawField
    
    That would allow projects using the mime4j library to be able to get a raw 
field without it returning a null value, to protect against potential NPE, 
without introducing breaking changes with its core API.
    
    The computing of the raw value in case it's null is based on what was in 
writeField method in DefaultMessageWriter.
---
 .../java/org/apache/james/mime4j/stream/Field.java     |  5 +++++
 .../java/org/apache/james/mime4j/stream/RawField.java  | 18 ++++++++++++++++++
 .../org/apache/james/mime4j/stream/RawFieldTest.java   |  7 ++++++-
 .../org/apache/james/mime4j/field/AbstractField.java   |  8 ++++++++
 .../james/mime4j/message/DefaultMessageWriter.java     | 12 +-----------
 5 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/core/src/main/java/org/apache/james/mime4j/stream/Field.java 
b/core/src/main/java/org/apache/james/mime4j/stream/Field.java
index bde3c79e..14da1f18 100644
--- a/core/src/main/java/org/apache/james/mime4j/stream/Field.java
+++ b/core/src/main/java/org/apache/james/mime4j/stream/Field.java
@@ -61,4 +61,9 @@ public interface Field {
      */
     ByteSequence getRaw();
 
+    /**
+     * Gets original (raw) representation of the field, if available,
+     * or compute it lazily otherwise.
+     */
+    ByteSequence getSafeRaw();
 }
diff --git a/core/src/main/java/org/apache/james/mime4j/stream/RawField.java 
b/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
index 1be89662..0f7c9dbd 100644
--- a/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
+++ b/core/src/main/java/org/apache/james/mime4j/stream/RawField.java
@@ -85,6 +85,24 @@ public final class RawField implements Field {
         return raw;
     }
 
+    /**
+     * Gets original (raw) representation of the field, if available,
+     * or compute it lazily otherwise.
+     */
+    public ByteSequence getSafeRaw() {
+        if (raw == null) {
+            StringBuilder buf = new StringBuilder();
+            buf.append(getName());
+            buf.append(": ");
+            String body = getBody();
+            if (body != null) {
+                buf.append(body);
+            }
+            return ContentUtil.encode(MimeUtil.fold(buf.toString(), 0));
+        }
+        return raw;
+    }
+
     public String getName() {
         return name;
     }
diff --git 
a/core/src/test/java/org/apache/james/mime4j/stream/RawFieldTest.java 
b/core/src/test/java/org/apache/james/mime4j/stream/RawFieldTest.java
index dbf0a3b7..775c92dd 100644
--- a/core/src/test/java/org/apache/james/mime4j/stream/RawFieldTest.java
+++ b/core/src/test/java/org/apache/james/mime4j/stream/RawFieldTest.java
@@ -22,11 +22,12 @@ package org.apache.james.mime4j.stream;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
 
-import junit.framework.Assert;
 import org.apache.james.mime4j.util.ByteSequence;
 import org.apache.james.mime4j.util.ContentUtil;
 import org.junit.Test;
 
+import junit.framework.Assert;
+
 public class RawFieldTest {
 
     @Test
@@ -35,6 +36,7 @@ public class RawFieldTest {
         ByteSequence raw = ContentUtil.encode(s);
         RawField field = new RawField(raw, 3, "raw", null);
         Assert.assertSame(raw, field.getRaw());
+        Assert.assertSame(raw, field.getSafeRaw());
         Assert.assertEquals("raw", field.getName());
         Assert.assertEquals("stuff;  more stuff", field.getBody());
         Assert.assertEquals(s, field.toString());
@@ -47,12 +49,14 @@ public class RawFieldTest {
     public void testPublicConstructor() throws Exception {
         RawField field1 = new RawField("raw", "stuff");
         Assert.assertNull(field1.getRaw());
+        Assert.assertEquals("raw: stuff", 
ContentUtil.decode(field1.getSafeRaw()));
         Assert.assertEquals("raw", field1.getName());
         Assert.assertEquals("stuff", field1.getBody());
         Assert.assertEquals("raw: stuff", field1.toString());
 
         RawField field2 = new RawField("raw", "any");
         Assert.assertNull(field2.getRaw());
+        Assert.assertEquals("raw: any", 
ContentUtil.decode(field2.getSafeRaw()));
         Assert.assertEquals("raw", field2.getName());
         Assert.assertEquals("any", field2.getBody());
         Assert.assertEquals("raw: any", field2.toString());
@@ -64,6 +68,7 @@ public class RawFieldTest {
         ByteSequence raw = ContentUtil.encode(s);
         RawField field = new RawField(raw, 3, "raw", null);
         Assert.assertSame(raw, field.getRaw());
+        Assert.assertSame(raw, field.getSafeRaw());
         Assert.assertEquals("raw", field.getName());
         Assert.assertEquals("stuff;  more stuff", field.getBody());
         Assert.assertEquals(s, field.toString());
diff --git a/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java 
b/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java
index f0580a31..d2d3f769 100644
--- a/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java
+++ b/dom/src/main/java/org/apache/james/mime4j/field/AbstractField.java
@@ -79,6 +79,14 @@ public abstract class AbstractField implements ParsedField {
         return rawField.getRaw();
     }
 
+    /**
+     * Gets original (raw) representation of the field, if available,
+     * or compute it lazily otherwise.
+     */
+    public ByteSequence getSafeRaw() {
+        return rawField.getSafeRaw();
+    }
+
     /**
      * @see ParsedField#isValidField()
      */
diff --git 
a/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java 
b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java
index 9e52c4f5..e8a7cf2d 100644
--- 
a/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java
+++ 
b/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageWriter.java
@@ -194,17 +194,7 @@ public class DefaultMessageWriter implements MessageWriter 
{
      *             if an I/O error occurs.
      */
     public void writeField(Field field, OutputStream out) throws IOException {
-        ByteSequence raw = field.getRaw();
-        if (raw == null) {
-            StringBuilder buf = new StringBuilder();
-            buf.append(field.getName());
-            buf.append(": ");
-            String body = field.getBody();
-            if (body != null) {
-                buf.append(body);
-            }
-            raw = ContentUtil.encode(MimeUtil.fold(buf.toString(), 0));
-        }
+        ByteSequence raw = field.getSafeRaw();
         writeBytes(raw, out);
         out.write(CRLF);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to