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]
