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