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); + } + +}