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 aaee98002e Fixed: Use non string parameters on a update-area failed 
when comme from a JWToken (OFBIZ-12749)
aaee98002e is described below

commit aaee98002e34b68da214a16d35ffc4372979b18d
Author: Nicolas Malin <nicolas.ma...@nereide.fr>
AuthorDate: Fri Jan 27 17:27:03 2023 +0100

    Fixed: Use non string parameters on a update-area failed when comme from a 
JWToken (OFBIZ-12749)
    
    When define a update-area with some parameters as List or Map the 
conversion failed due to a bad management of this case when the creation come 
from a JWToken.
    
        <actions>
            <set field="myList" value="${groovy: ['myCase']}"/>
        </actions>
        <field name="myField"><hyperlink link-type="layered-modal" ...>
            <set-callback area-target="myTarget">
                <parameter param-name="myList"/>
            </set-callback>
        </hyperlink></field>
    
    The link generate for the callback contains the variable myField with the 
class name and not serialized List "['myCase']"
---
 .../ofbiz/widget/model/CommonWidgetModels.java     | 22 +++++++
 .../org/apache/ofbiz/widget/model/ModelForm.java   |  4 +-
 .../apache/ofbiz/widget/model/ModelFormTest.java   | 75 ++++++++++++++++++++++
 3 files changed, 99 insertions(+), 2 deletions(-)

diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java
index 258d6a9e59..9992ec14cb 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java
@@ -31,6 +31,8 @@ import java.util.Map;
 import java.util.TimeZone;
 
 import org.apache.ofbiz.base.util.Debug;
+import org.apache.ofbiz.base.util.GeneralException;
+import org.apache.ofbiz.base.util.ObjectType;
 import org.apache.ofbiz.base.util.UtilCodec;
 import org.apache.ofbiz.base.util.UtilDateTime;
 import org.apache.ofbiz.base.util.UtilGenerics;
@@ -774,4 +776,24 @@ public final class CommonWidgetModels {
             return null;
         }
     }
+
+    /**
+     * Object dedicate to the creation of parameter object
+     */
+    public static class ParameterFactory {
+
+        /**
+         * For an entry map return a parameter after convert correctly the 
value
+         * @param entry
+         * @return
+         */
+        public static Parameter create(Map.Entry<String, Object> entry) {
+            try {
+                return new CommonWidgetModels.Parameter(entry.getKey(),
+                        (String) 
ObjectType.simpleTypeOrObjectConvert(entry.getValue(), "String", null, null), 
false);
+            } catch (GeneralException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
 }
diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java
index a7d1cdf19a..c214862cd7 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java
@@ -2505,7 +2505,7 @@ public abstract class ModelForm extends ModelWidget {
         }
 
         /**
-         * Retrieva Jwt from context, validate it and generate UpdateArea 
Object
+         * Retrieve a Jwt from context, validate it and generate UpdateArea 
Object
          * @return UpdateArea object
          */
         public static ModelForm.UpdateArea fromJwtToken(Map<String, Object> 
context) {
@@ -2541,7 +2541,7 @@ public abstract class ModelForm extends ModelWidget {
                     parameters != null
                             ? parameters.entrySet()
                             .stream()
-                            .map(entry -> new 
CommonWidgetModels.Parameter(entry.getKey(), (String) entry.getValue(), false))
+                            .map(entry -> 
CommonWidgetModels.ParameterFactory.create(entry))
                             .collect(Collectors.toList())
                             : new ArrayList<>());
         }
diff --git 
a/framework/widget/src/test/java/org/apache/ofbiz/widget/model/ModelFormTest.java
 
b/framework/widget/src/test/java/org/apache/ofbiz/widget/model/ModelFormTest.java
new file mode 100644
index 0000000000..f3d6aef2c3
--- /dev/null
+++ 
b/framework/widget/src/test/java/org/apache/ofbiz/widget/model/ModelFormTest.java
@@ -0,0 +1,75 @@
+package org.apache.ofbiz.widget.model;
+
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.any;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.ofbiz.base.conversion.ConversionException;
+import org.apache.ofbiz.base.conversion.JSONConverters;
+import org.apache.ofbiz.base.util.UtilMisc;
+import org.apache.ofbiz.entity.Delegator;
+import org.apache.ofbiz.entity.GenericEntityException;
+import org.apache.ofbiz.webapp.control.JWTManager;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class ModelFormTest {
+    private HashMap<String, Object> context;
+    private Delegator delegator;
+
+    @Before
+    public void setUp() throws GenericEntityException {
+        context = new HashMap<>();
+        delegator = Mockito.mock(Delegator.class);
+        when(delegator.findList(any(), any(), any(), any(), any(), 
Mockito.anyBoolean()))
+                .thenReturn(new ArrayList<>());
+    }
+
+    @Test
+    public void testCreateUpdateAreaFromJWTAreaValues() {
+        context.put(CommonWidgetModels.JWT_CALLBACK, 
JWTManager.createJwt(delegator,
+                Map.of("areaId", "myAreaId",
+                        "areaTarget", "myAreaTarget")));
+        ModelForm.UpdateArea updateArea = 
ModelForm.UpdateArea.fromJwtToken(context);
+        Assert.assertEquals("areaId not correct", updateArea.getAreaId(), 
"myAreaId");
+        Assert.assertEquals("areaTarget not correct", 
updateArea.getAreaTarget(), "myAreaTarget");
+    }
+
+    @Test
+    public void testCreateUpdateAreaFromJWTWithParametersMapString() throws 
ConversionException {
+        JSONConverters.MapToJSON converter = new JSONConverters.MapToJSON();
+        context.put(CommonWidgetModels.JWT_CALLBACK, 
JWTManager.createJwt(delegator,
+                Map.of("areaId", "myAreaId",
+                "areaTarget", "myAreaTarget",
+                "parameters", converter.convert(Map.of("entry1", 
"value1")).toString())));
+        ModelForm.UpdateArea updateArea = 
ModelForm.UpdateArea.fromJwtToken(context);
+        CommonWidgetModels.Parameter parameter = getParameterOnly(updateArea);
+        Assert.assertEquals("Parameters key name isn't the same", 
parameter.getName(), "entry1");
+        Assert.assertEquals("Parameters value isn't the same", 
parameter.getValue().toString(), "value1");
+    }
+
+    @Test
+    public void testCreateUpdateAreaFromJWTWithParametersMapList() throws  
ConversionException {
+        JSONConverters.MapToJSON converter = new JSONConverters.MapToJSON();
+        context.put(CommonWidgetModels.JWT_CALLBACK, 
JWTManager.createJwt(delegator,
+                Map.of("areaId", "myAreaId",
+                "areaTarget", "myAreaTarget",
+                "parameters", converter.convert(UtilMisc.toMap("entry1", 
List.of("1", "2"))).toString())));
+        ModelForm.UpdateArea updateArea = 
ModelForm.UpdateArea.fromJwtToken(context);
+        CommonWidgetModels.Parameter parameter = getParameterOnly(updateArea);
+        Assert.assertEquals("Parameters key name isn't the same", 
parameter.getName(), "entry1");
+        Assert.assertEquals("Parameters value isn't the same", 
parameter.getValue().toString(), "[1, 2]");
+    }
+
+    private static CommonWidgetModels.Parameter 
getParameterOnly(ModelForm.UpdateArea updateArea) {
+        Assert.assertNotNull(updateArea.getParameterList());
+        Assert.assertEquals("Parameter size should be one", 
updateArea.getParameterList().size(), 1);
+        return updateArea.getParameterList().get(0);
+    }
+
+}

Reply via email to