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

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

commit d429f252df223ad6008cef3969a0ccd7c61bf857
Author: Benoit Tellier <[email protected]>
AuthorDate: Mon May 11 10:29:50 2020 +0700

    [REFACTORING] MDN parboiled parser can be a constant
    
    Instantiation of the parser was performed via reflection upon each MDN
    parsing.
    
    The instantiation of the parser generated several exception stack-traces
    on one of our running production instance:
    
    ```
     java.lang.RuntimeException: Error creating extended parser class: null
        at org.parboiled.Parboiled.createParser(Parboiled.java:58)
        at org.apache.james.mdn.MDNReportParser.parse(MDNReportParser.java:57)
        at org.apache.james.mdn.MDNReportParser.parse(MDNReportParser.java:53)
        at 
org.apache.james.jmap.mailet.ExtractMDNOriginalJMAPMessageId.parseReport(ExtractMDNOriginalJMAPMessageId.java:120)
    [...]
    Caused by: java.lang.IllegalArgumentException: null
        at org.objectweb.asm.ClassVisitor.<init>(Unknown Source)
        at org.objectweb.asm.ClassVisitor.<init>(Unknown Source)
        at org.objectweb.asm.tree.ClassNode.<init>(Unknown Source)
        at 
org.parboiled.transform.ParserClassNode.<init>(ParserClassNode.java:43)
        at 
org.parboiled.transform.ParserTransformer.extendParserClass(ParserTransformer.java:43)
        at 
org.parboiled.transform.ParserTransformer.transformParser(ParserTransformer.java:39)
        at org.parboiled.Parboiled.createParser(Parboiled.java:54)
    ```
    
    Given that a parser only defines a set of rules, and is thus immutable,
    we can turn it into a constant, effectively solving our problem.
---
 mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java 
b/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java
index a1dc416..3c2e8a6 100644
--- a/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java
+++ b/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java
@@ -46,6 +46,8 @@ import org.parboiled.support.ParsingResult;
 import com.google.common.annotations.VisibleForTesting;
 
 public class MDNReportParser {
+    private static final Parser PARSER = Parboiled.createParser(Parser.class);
+
     public MDNReportParser() {
     }
 
@@ -54,8 +56,8 @@ public class MDNReportParser {
     }
 
     public Optional<MDNReport> parse(String mdnReport) {
-        Parser parser = Parboiled.createParser(MDNReportParser.Parser.class);
-        ParsingResult<Object> result = new 
ReportingParseRunner<>(parser.dispositionNotificationContent()).run(mdnReport);
+        ParsingResult<Object> result = new 
ReportingParseRunner<>(PARSER.dispositionNotificationContent())
+            .run(mdnReport);
         if (result.matched) {
             return Optional.of((MDNReport)result.resultValue);
         }


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

Reply via email to