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

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


The following commit(s) were added to refs/heads/master by this push:
     new 964f97b5 MIME4J-333 Introducing a getSafeRaw() method in RawField 
(#118)
964f97b5 is described below

commit 964f97b5774cc2a57b5ea7c92b755c4cdb116fc8
Author: Rene Cordier <[email protected]>
AuthorDate: Mon Sep 1 05:54:26 2025 +0700

    MIME4J-333 Introducing a getSafeRaw() method in RawField (#118)
    
    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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to