You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2020/04/09 14:46:02 UTC

[commons-jexl] branch master updated: JEXL-330: different solution due, some regressions in real world tests Task #JEXL-330 - JexlException.Parsing.getMessage() throws StringIndexOutOfBoundsException when parse error is in long expression

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

henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git


The following commit(s) were added to refs/heads/master by this push:
     new 46c3172  JEXL-330: different solution due, some regressions in real world tests Task #JEXL-330 - JexlException.Parsing.getMessage() throws StringIndexOutOfBoundsException when parse error is in long expression
46c3172 is described below

commit 46c31721002fad0fd7f5b1115bf0016b292a0a35
Author: henrib <he...@apache.org>
AuthorDate: Thu Apr 9 16:44:33 2020 +0200

    JEXL-330: different solution due, some regressions in real world tests
    Task #JEXL-330 - JexlException.Parsing.getMessage() throws StringIndexOutOfBoundsException when parse error is in long expression
---
 .../java/org/apache/commons/jexl3/JexlException.java     | 16 ++++++++++------
 .../java/org/apache/commons/jexl3/parser/JexlParser.java |  2 +-
 src/main/java/org/apache/commons/jexl3/parser/Parser.jjt |  4 ++--
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/JexlException.java b/src/main/java/org/apache/commons/jexl3/JexlException.java
index 7c0e334..34231a8 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlException.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlException.java
@@ -236,15 +236,19 @@ public class JexlException extends RuntimeException {
         if (length < MAX_EXCHARLOC) {
             return prefix + " error in '" + expr + "'";
         } else {
-            int begin = info.getColumn();
-            int end = begin + (MAX_EXCHARLOC / 2);
-            begin -= (MAX_EXCHARLOC / 2);
-            if (begin < 0) {
-                end -= begin;
+            int me = MAX_EXCHARLOC / 2;
+            int begin = info.getColumn() - me;
+            if (begin < 0 || length < me) {
                 begin = 0;
+            } else if (begin > length) {
+                begin = me;
+            }
+            int end = begin + MAX_EXCHARLOC;
+            if (end > length) {
+                end = length;
             }
             return prefix + " error near '... "
-                    + expr.substring(begin, end > length ? length : end) + " ...'";
+                    + expr.substring(begin, end) + " ...'";
         }
     }
     
diff --git a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
index bab6c63..85b21d1 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
+++ b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
@@ -572,7 +572,7 @@ public abstract class JexlParser extends StringParser {
         }
         if (tok != null) {
             xinfo = info.at(tok.beginLine, tok.beginColumn);
-            msg = readSourceLine(source, tok.beginLine);
+            msg = tok.image;
             if (xclazz != null) {
                 try {
                     Constructor<T> ctor = xclazz.getConstructor(JexlInfo.class, String.class);
diff --git a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
index e637d59..fb5ae37 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
+++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt
@@ -70,8 +70,8 @@ public final class Parser extends JexlParser
         } catch (TokenMgrError xtme) {
             throw new JexlException.Tokenization(info, xtme).clean();
         } catch (ParseException xparse) {
-            Token errortok = errorToken(token, jj_lastpos, jj_scanpos, token.next);
-            throw new JexlException.Parsing(info.at(errortok.beginLine, errortok.beginColumn), jexlSrc).clean();
+            Token errortok = errorToken(jj_lastpos, jj_scanpos, token.next, token);
+            throw new JexlException.Parsing(info.at(errortok.beginLine, errortok.beginColumn), errortok.image).clean();
         } finally {
             token_source.defaultLexState = DEFAULT;
             cleanup(previous);