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

nmalin pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 6393e21a85 Improved: Update end bracket detection en groovy scriplet 
(OFBIZ-13178)
6393e21a85 is described below

commit 6393e21a85e10b278b3274e05432b0b302ab0dd5
Author: Nicolas Malin <nicolas.ma...@nereide.fr>
AuthorDate: Tue Nov 19 10:36:28 2024 +0100

    Improved: Update end bracket detection en groovy scriplet (OFBIZ-13178)
    
    When you use double brackets on groovy scriptlet, the end bracket isn't 
correctly manage.
    
    The follow simple code failed :
    
    ${groovy: if (true) {return 0}}
---
 .../base/util/string/FlexibleStringExpander.java   | 22 ++++++++++++++--------
 .../util/string/FlexibleStringExpanderTests.java   |  4 +++-
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git 
a/framework/base/src/main/java/org/apache/ofbiz/base/util/string/FlexibleStringExpander.java
 
b/framework/base/src/main/java/org/apache/ofbiz/base/util/string/FlexibleStringExpander.java
index 6a60a166b6..dc4166806f 100644
--- 
a/framework/base/src/main/java/org/apache/ofbiz/base/util/string/FlexibleStringExpander.java
+++ 
b/framework/base/src/main/java/org/apache/ofbiz/base/util/string/FlexibleStringExpander.java
@@ -309,17 +309,11 @@ public abstract class FlexibleStringExpander implements 
Serializable, IsEmpty {
             }
             if (expression.indexOf("groovy:", start + 2) == start + 2 && 
!escapedExpression) {
                 // checks to see if this starts with a "groovy:", if so treat 
the rest of the expression as a groovy scriptlet
+                end = getMatchingClosingBracket(expression, start, origLen, 
end);
                 strElems.add(new ScriptElem(chars, start, Math.min(end + 1, 
start + length) - start, start + 9, end - start - 9));
             } else {
                 // Scan for matching closing bracket
-                int ptr = expression.indexOf("{", start + 2);
-                while (ptr != -1 && end != -1 && ptr < end) {
-                    end = expression.indexOf(CLOSE_BRACKET, end + 1);
-                    ptr = expression.indexOf("{", ptr + 1);
-                }
-                if (end == -1) {
-                    end = origLen;
-                }
+                end = getMatchingClosingBracket(expression, start, origLen, 
end);
                 // Evaluation sequence is important - do not change it
                 if (escapedExpression) {
                     strElems.add(new ConstOffsetElem(chars, start, end + 1 - 
start));
@@ -352,6 +346,18 @@ public abstract class FlexibleStringExpander implements 
Serializable, IsEmpty {
         return strElems.toArray(new FlexibleStringExpander[strElems.size()]);
     }
 
+    private static int getMatchingClosingBracket(String expression, int start, 
int origLen, int end) {
+        int ptr = expression.indexOf("{", start + 2);
+        while (ptr != -1 && end != -1 && ptr < end) {
+            end = expression.indexOf(CLOSE_BRACKET, end + 1);
+            ptr = expression.indexOf("{", ptr + 1);
+        }
+        if (end == -1) {
+            end = origLen;
+        }
+        return end;
+    }
+
     // Note: a character array is used instead of a String to keep the memory 
footprint small.
     private final char[] chars;
     private int hint = 20;
diff --git 
a/framework/base/src/test/java/org/apache/ofbiz/base/util/string/FlexibleStringExpanderTests.java
 
b/framework/base/src/test/java/org/apache/ofbiz/base/util/string/FlexibleStringExpanderTests.java
index 44b5afac5d..0bc528f419 100644
--- 
a/framework/base/src/test/java/org/apache/ofbiz/base/util/string/FlexibleStringExpanderTests.java
+++ 
b/framework/base/src/test/java/org/apache/ofbiz/base/util/string/FlexibleStringExpanderTests.java
@@ -316,8 +316,10 @@ public class FlexibleStringExpanderTests {
         fseTest("UEL integration: missing", "${noList[0]}", testMap, null, 
null, "", null, false);
         fseTest("Escaped expression", "This is an \\${escaped} expression", 
testMap, "This is an ${escaped} expression", false);
         fseTest("Escaped(groovy) expression", "This is an \\${groovy:escaped} 
expression", testMap, "This is an ${groovy:escaped} expression", false);
+        fseTest("Bracket en groovy", "This is a groovy ${groovy: if (true) 
{return 'bracket'}} expression", testMap, "This is a groovy bracket 
expression", false);
+        fseTest("Bracket en groovy again", "This is a groovy ${groovy: if 
(true) {if (true) {return 'with 2 brackets'}}} expression", testMap, "This is a 
groovy with 2 brackets expression", false);
 
-        // TODO: Find a better way to setup or handle the big decimal value. 
If new ones are not instanciated in the test
+        // TODO: Find a better way to setup or handle the big decimal value. 
If new ones are not instantiated in the test
         // it fails because of the comparison between object pointers..
         fseTest("nested UEL integration(return BigDecimal)", "${a${'moun'}t}", 
testMap, null, LOCALE_TO_TEST,
                 "1,234,567.89", new BigDecimal("1234567.89"), false);

Reply via email to