You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2021/11/10 07:36:26 UTC

[struts] branch WW-5129-dynamic-attributes created (now e098c5a)

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

lukaszlenart pushed a change to branch WW-5129-dynamic-attributes
in repository https://gitbox.apache.org/repos/asf/struts.git.


      at e098c5a  WW-5129 Simplifies excluding ignored keys with ?filter

This branch includes the following new commits:

     new 7403de8  WW-5129 Supports dynamic attributes in second control
     new 57ed560  WW-5129 Trims internal prefix used to identify second control's Dynamic Attributes
     new e098c5a  WW-5129 Simplifies excluding ignored keys with ?filter

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[struts] 02/03: WW-5129 Trims internal prefix used to identify second control's Dynamic Attributes

Posted by lu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch WW-5129-dynamic-attributes
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 57ed5605c9e95a9c5a9d71ae80fd080df490c489
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Wed Nov 10 08:12:23 2021 +0100

    WW-5129 Trims internal prefix used to identify second control's Dynamic Attributes
---
 .../template/simple/prefixed-dynamic-attributes.ftl      |  2 +-
 .../apache/struts2/views/jsp/ui/DoubleSelectTest.java    |  4 ++--
 .../struts2/views/jsp/ui/InputTransferSelectTagTest.java |  2 +-
 .../views/jsp/ui/OptionTransferSelectTagTest.java        |  4 ++--
 .../org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt   |  4 ++--
 .../struts2/views/jsp/ui/inputtransferselect-2.txt       |  4 ++--
 .../struts2/views/jsp/ui/optiontransferselect-8.txt      | 16 ++++++++--------
 7 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl b/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl
index 68f2ea6..3b6c71b 100644
--- a/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl
+++ b/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl
@@ -29,7 +29,7 @@
 <#else>
     <#assign value = keyValue?string/>
 </#if>
- ${aKey}="${value}"<#rt/>
+ ${aKey?keep_after(prefix)}="${value}"<#rt/>
 </#if>
 </#list><#rt/>
 </#if><#rt/>
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java
index 7515576..15e0a17 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java
@@ -289,8 +289,8 @@ public class DoubleSelectTest extends AbstractUITagTest {
 
     public void testGenericSimpleWithDynamicAttributes() throws Exception {
         DoubleSelectTag tag = new DoubleSelectTag();
-        tag.setDynamicAttribute(null, "first-name", "firstName");
-        tag.setDynamicAttribute(null, "second-name", "secondName");
+        tag.setDynamicAttribute(null, "select-name", "firstName");
+        tag.setDynamicAttribute(null, "second-select-name", "secondName");
         prepareTagGeneric(tag);
         verifyGenericProperties(tag, "simple", new String[]{"value"});
         verify(SelectTag.class.getResource("DoubleSelect-5.txt"));
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java
index 44ec403..8a60172 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java
@@ -57,7 +57,7 @@ public class InputTransferSelectTagTest extends AbstractUITagTest {
 
         InputTransferSelectTag tag = new InputTransferSelectTag();
         tag.setPageContext(pageContext);
-        tag.setDynamicAttribute(null, "input-name", "inputName");
+        tag.setDynamicAttribute(null, "input-collection-name", "inputName");
         tag.setDynamicAttribute(null, "collection-name", "collectionName");
 
         tag.setName("collection");
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java
index 0aec5a1..9742eff 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java
@@ -548,8 +548,8 @@ public class OptionTransferSelectTagTest extends AbstractUITagTest {
         tag.setDoubleName("list2");
         tag.setDoubleList("list2");
 
-        tag.setDynamicAttribute(null, "left-name", "leftName");
-        tag.setDynamicAttribute(null, "right-name", "rightName");
+        tag.setDynamicAttribute(null, "collection", "leftName");
+        tag.setDynamicAttribute(null, "right-collection", "rightName");
 
         tag.doStartTag();
         tag.doEndTag();
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt
index 23cf7f2..2472936 100644
--- a/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt
@@ -2,12 +2,12 @@
   title="someTitle" onclick="onclick1" ondblclick="ondblclick1" onmousedown="onmousedown1" onmouseup="onmouseup1"
   onmouseover="onmouseover1" onmousemove="onmousemove1" onmouseout="onmouseout1" onfocus="onfocus1" onblur="onblur1"
   onkeypress="onkeypress1" onkeydown="onkeydown1" onkeyup="onkeyup1" onselect="onchange"
-  onchange="someIdRedirect(this.selectedIndex)" first-name="firstName">
+  onchange="someIdRedirect(this.selectedIndex)" select-name="firstName">
   <option value="BE">Belgium</option>
   <option value="FR" selected="selected">France</option>
 </select>
 <br />
-<select name="region" disabled="disabled" id="region" title="someTitle" second-name="secondName"></select>
+<select name="region" disabled="disabled" id="region" title="someTitle" select-name="secondName"></select>
 <script type="text/javascript">
   var someIdGroup = newArray(2 + 0);
   for (var i = 0; i < (2 + 0); i++) {
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt
index 264fb6b..9c11a87 100644
--- a/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt
@@ -1,10 +1,10 @@
 <tr>
   <td class="tdLabel"></td>
   <td class="tdInput">
-    <script type="text/javascript" src="/struts/inputtransferselect.js"></script>
+    <script type="text/javascript" src="/static/inputtransferselect.js"></script>
     <table>
       <tr>
-        <td><input type="text" name="collection_input" id="collection_input" input-name="inputName"/></td>
+        <td><input type="text" name="collection_input" id="collection_input" collection-name="inputName" /></td>
         <td class="tdTransferSelect">
           <input type="button" value="-&gt;"
             onclick="addOption(document.getElementById('collection_input'),document.getElementById('collection'))" />
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt
index 06cfd1c..4f62749 100644
--- a/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt
@@ -1,11 +1,11 @@
 <tr>
   <td class="tdLabel"></td>
   <td class="tdInput">
-    <script type="text/javascript" src="/struts/optiontransferselect.js"></script>
+    <script type="text/javascript" src="/static/optiontransferselect.js"></script>
     <table>
       <tr>
         <td>
-          <select name="collection" size="15" id="collection" multiple="multiple" left-name="leftName">
+          <select name="collection" size="15" id="collection" multiple="multiple" collection="leftName">
             <option value="Left1" selected="selected">Left1</option>
             <option value="Left2" selected="selected">Left2</option>
           </select>
@@ -14,29 +14,29 @@
           <input type="button" onclick="moveOptionUp(document.getElementById('collection'),'key',''); " value="^" />
         </td>
         <td class="tdTransferSelect">
-          <input type="button" value="<-"
+          <input type="button" value="&lt;-"
             onclick="moveSelectedOptions(document.getElementById('list2'),document.getElementById('collection'),false,'');" />
           <br />
           <br />
-          <input type="button" value="->"
+          <input type="button" value="-&gt;"
             onclick="moveSelectedOptions(document.getElementById('collection'),document.getElementById('list2'),false,'');" />
           <br />
           <br />
-          <input type="button" value="<<--"
+          <input type="button" value="&lt;&lt;--"
             onclick="moveAllOptions(document.getElementById('list2'),document.getElementById('collection'),false,'');" />
           <br />
           <br />
-          <input type="button" value="-->>"
+          <input type="button" value="--&gt;&gt;"
             onclick="moveAllOptions(document.getElementById('collection'),document.getElementById('list2'),false,'');" />
           <br />
           <br />
-          <input type="button" value="<*>"
+          <input type="button" value="&lt;*&gt;"
             onclick="selectAllOptions(document.getElementById('collection'));selectAllOptions(document.getElementById('list2'));" />
           <br />
           <br />
         </td>
         <td>
-          <select name="list2" size="15" multiple="multiple" id="list2" right-name="rightName">
+          <select name="list2" size="15" multiple="multiple" id="list2" collection="rightName">
             <option value="Right1" selected="selected">Right1</option>
             <option value="Right2" selected="selected">Right2</option>
           </select>

[struts] 01/03: WW-5129 Supports dynamic attributes in second control

Posted by lu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch WW-5129-dynamic-attributes
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 7403de84a1972a608863d15b37b19e49a632d912
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Mon Jul 5 07:47:34 2021 +0200

    WW-5129 Supports dynamic attributes in second control
---
 .../resources/template/simple/doubleselect.ftl     |  5 ++-
 .../template/simple/dynamic-attributes.ftl         | 24 ++++++++---
 .../template/simple/inputtransferselect.ftl        |  8 ++--
 .../template/simple/optiontransferselect.ftl       |  3 ++
 ...ributes.ftl => prefixed-dynamic-attributes.ftl} | 16 ++++---
 core/src/main/resources/template/simple/select.ftl |  4 +-
 .../struts2/views/jsp/ui/DoubleSelectTest.java     | 11 ++++-
 .../views/jsp/ui/InputTransferSelectTagTest.java   | 32 +++++++++++---
 .../views/jsp/ui/OptionTransferSelectTagTest.java  | 32 ++++++++++++++
 .../apache/struts2/views/jsp/ui/DoubleSelect-5.txt | 39 +++++++++++++++++
 .../struts2/views/jsp/ui/inputtransferselect-2.txt | 30 +++++++++++++
 .../views/jsp/ui/optiontransferselect-8.txt        | 50 ++++++++++++++++++++++
 12 files changed, 228 insertions(+), 26 deletions(-)

diff --git a/core/src/main/resources/template/simple/doubleselect.ftl b/core/src/main/resources/template/simple/doubleselect.ftl
index 67aafee..039e142 100644
--- a/core/src/main/resources/template/simple/doubleselect.ftl
+++ b/core/src/main/resources/template/simple/doubleselect.ftl
@@ -18,6 +18,7 @@
  * under the License.
  */
 -->
+<#global dynamic_attributes_ignore = "second-"/>
 <#include "/${parameters.templateDir}/simple/select.ftl" />
 <#assign startCount = 0/>
 <#if parameters.headerKey?? && parameters.headerValue??>
@@ -60,6 +61,8 @@
 <#if parameters.doubleDisabled!false>
         disabled="disabled"<#rt/>
 </#if>
+<#include "/${parameters.templateDir}/${parameters.expandTheme}/prefixed-dynamic-attributes.ftl" />
+<@prefixedDynamicAttributes prefix="second-"/>
         >
 </select>
 <#if parameters.doubleMultiple!false>
@@ -190,4 +193,4 @@
             ${parameters.id}Temp.options[0].selected = true;
         }
     }
-</script>
\ No newline at end of file
+</script>
diff --git a/core/src/main/resources/template/simple/dynamic-attributes.ftl b/core/src/main/resources/template/simple/dynamic-attributes.ftl
index 7823159..fe82ac6 100644
--- a/core/src/main/resources/template/simple/dynamic-attributes.ftl
+++ b/core/src/main/resources/template/simple/dynamic-attributes.ftl
@@ -21,12 +21,24 @@
 <#if (parameters.dynamicAttributes?? && parameters.dynamicAttributes?size > 0)><#rt/>
 <#assign aKeys = parameters.dynamicAttributes.keySet()><#rt/>
 <#list aKeys as aKey><#rt/>
-  <#assign keyValue = parameters.dynamicAttributes.get(aKey)/>
-  <#if keyValue?is_string>
-      <#assign value = struts.translateVariables(keyValue)!keyValue/>
-  <#else>
-      <#assign value = keyValue?string/>
-  </#if>
+<#if dynamic_attributes_ignore??>
+<#if !aKey?starts_with(dynamic_attributes_ignore)>
+<#assign keyValue = parameters.dynamicAttributes.get(aKey)/>
+<#if keyValue?is_string>
+    <#assign value = struts.translateVariables(keyValue)!keyValue/>
+<#else>
+    <#assign value = keyValue?string/>
+</#if>
  ${aKey}="${value}"<#rt/>
+</#if>
+<#else>
+<#assign keyValue = parameters.dynamicAttributes.get(aKey)/>
+<#if keyValue?is_string>
+    <#assign value = struts.translateVariables(keyValue)!keyValue/>
+<#else>
+    <#assign value = keyValue?string/>
+</#if>
+ ${aKey}="${value}"<#rt/>
+</#if>
 </#list><#rt/>
 </#if><#rt/>
diff --git a/core/src/main/resources/template/simple/inputtransferselect.ftl b/core/src/main/resources/template/simple/inputtransferselect.ftl
index a9258dd..7684a09 100644
--- a/core/src/main/resources/template/simple/inputtransferselect.ftl
+++ b/core/src/main/resources/template/simple/inputtransferselect.ftl
@@ -29,7 +29,6 @@
 	<label for="leftTitle">${parameters.leftTitle}</label><br />
 </#if><#t/>
 
-
 <input type="text"<#rt/>
  name="${parameters.name!""}_input"<#rt/>
 <#if parameters.disabled!false>
@@ -55,6 +54,8 @@
 </#if>
 <#include "/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" />
 <#include "/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" />
+<#include "/${parameters.templateDir}/${parameters.expandTheme}/prefixed-dynamic-attributes.ftl" />
+<@prefixedDynamicAttributes prefix="input-"/>
 />
 
 
@@ -94,9 +95,10 @@
 <#if parameters.rightTitle?has_content><#t/>
 	<label for="rightTitle">${parameters.rightTitle}</label><br />
 </#if><#t/>
+<#global dynamic_attributes_ignore = "input-"/>
 <#include "/${parameters.templateDir}/simple/select.ftl" />
 <#if parameters.allowUpDown!true>
-<input type="button" 
+<input type="button"
 <#if parameters.headerKey?has_content>
 	onclick="moveOptionDown(document.getElementById('${parameters.id}'), 'key', '${parameters.headerKey}');"
 <#else>
@@ -106,7 +108,7 @@
 	value="${parameters.downLabel}"
 </#if>
 />
-<input type="button" 
+<input type="button"
 <#if parameters.headerKey?has_content>
 	onclick="moveOptionUp(document.getElementById('${parameters.id}'), 'key', '${parameters.headerKey}');"
 <#else>
diff --git a/core/src/main/resources/template/simple/optiontransferselect.ftl b/core/src/main/resources/template/simple/optiontransferselect.ftl
index e0d00ee..36d4ca3 100644
--- a/core/src/main/resources/template/simple/optiontransferselect.ftl
+++ b/core/src/main/resources/template/simple/optiontransferselect.ftl
@@ -28,6 +28,7 @@
 <#if parameters.leftTitle??><#t/>
 	<label for="leftTitle">${parameters.leftTitle}</label><br />
 </#if><#t/>
+<#global dynamic_attributes_ignore = "right-"/>
 <#include "/${parameters.templateDir}/simple/select.ftl" />
 <#if parameters.allowUpDownOnLeft!true>
 <input type="button"
@@ -247,6 +248,8 @@
     <#if parameters.doubleAccesskey??><#t/>
     accesskey="<#outputformat 'JavaScript'>${parameters.doubleAccesskey}</#outputformat>"
     </#if>
+	<#include "/${parameters.templateDir}/${parameters.expandTheme}/prefixed-dynamic-attributes.ftl" />
+	<@prefixedDynamicAttributes prefix="right-"/>
 >
 	<#if parameters.doubleHeaderKey?? && parameters.doubleHeaderValue??><#t/>
     <option value="${parameters.doubleHeaderKey}">${parameters.doubleHeaderValue}</option>
diff --git a/core/src/main/resources/template/simple/dynamic-attributes.ftl b/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl
similarity index 77%
copy from core/src/main/resources/template/simple/dynamic-attributes.ftl
copy to core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl
index 7823159..68f2ea6 100644
--- a/core/src/main/resources/template/simple/dynamic-attributes.ftl
+++ b/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl
@@ -18,15 +18,19 @@
  * under the License.
  */
 -->
+<#macro prefixedDynamicAttributes prefix>
 <#if (parameters.dynamicAttributes?? && parameters.dynamicAttributes?size > 0)><#rt/>
 <#assign aKeys = parameters.dynamicAttributes.keySet()><#rt/>
 <#list aKeys as aKey><#rt/>
-  <#assign keyValue = parameters.dynamicAttributes.get(aKey)/>
-  <#if keyValue?is_string>
-      <#assign value = struts.translateVariables(keyValue)!keyValue/>
-  <#else>
-      <#assign value = keyValue?string/>
-  </#if>
+<#if aKey?starts_with(prefix)>
+<#assign keyValue = parameters.dynamicAttributes.get(aKey)/>
+<#if keyValue?is_string>
+    <#assign value = struts.translateVariables(keyValue)!keyValue/>
+<#else>
+    <#assign value = keyValue?string/>
+</#if>
  ${aKey}="${value}"<#rt/>
+</#if>
 </#list><#rt/>
 </#if><#rt/>
+</#macro>
diff --git a/core/src/main/resources/template/simple/select.ftl b/core/src/main/resources/template/simple/select.ftl
index e096cb7..7e90c80 100644
--- a/core/src/main/resources/template/simple/select.ftl
+++ b/core/src/main/resources/template/simple/select.ftl
@@ -68,7 +68,7 @@
             <#assign itemKeyStr = stack.findString('top')>
         </#if>
         <#if parameters.listValueKey??>
-          <#-- checks the valueStack for the 'valueKey.' The valueKey is then looked-up in the locale file for it's 
+          <#-- checks the valueStack for the 'valueKey.' The valueKey is then looked-up in the locale file for it's
              localized value.  This is then used as a label -->
           <#assign valueKey = stack.findString(parameters.listValueKey)!'' />
           <#if valueKey?has_content>
@@ -139,7 +139,7 @@
    <#if ( !parameters.id?? && !parameters.name??)>
      <input type="hidden" id="" name="" value="" <#rt/>
   </#if>
-  
+
 <#if parameters.disabled!false>
  disabled="disabled"<#rt/>
 </#if>
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java
index 536a5d9..7515576 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java
@@ -287,6 +287,15 @@ public class DoubleSelectTest extends AbstractUITagTest {
         verifyGenericProperties(tag, "simple", new String[]{"value"});
     }
 
+    public void testGenericSimpleWithDynamicAttributes() throws Exception {
+        DoubleSelectTag tag = new DoubleSelectTag();
+        tag.setDynamicAttribute(null, "first-name", "firstName");
+        tag.setDynamicAttribute(null, "second-name", "secondName");
+        prepareTagGeneric(tag);
+        verifyGenericProperties(tag, "simple", new String[]{"value"});
+        verify(SelectTag.class.getResource("DoubleSelect-5.txt"));
+    }
+
     public void testGenericXhtml() throws Exception {
         DoubleSelectTag tag = new DoubleSelectTag();
         prepareTagGeneric(tag);
@@ -379,4 +388,4 @@ public class DoubleSelectTest extends AbstractUITagTest {
             return key;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java
index ee60cd8..44ec403 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java
@@ -18,19 +18,16 @@
  */
 package org.apache.struts2.views.jsp.ui;
 
-import org.apache.struts2.views.jsp.AbstractUITagTest;
 import org.apache.struts2.TestAction;
+import org.apache.struts2.views.jsp.AbstractUITagTest;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
-/**
- *
- */
 public class InputTransferSelectTagTest extends AbstractUITagTest {
 
     public void testWithRequired() throws Exception {
-        List list = new ArrayList();
+        List<String> list = new ArrayList<>();
         list.add("Item One");
         list.add("Item Two");
 
@@ -47,7 +44,28 @@ public class InputTransferSelectTagTest extends AbstractUITagTest {
         tag.doStartTag();
         tag.doEndTag();
 
-        //System.out.println(writer.toString());
         verify(InputTransferSelectTagTest.class.getResource("inputtransferselect-1.txt"));
     }
+
+    public void testDynamicAttributes() throws Exception {
+        List<String> list = new ArrayList<>();
+        list.add("Item One");
+        list.add("Item Two");
+
+        TestAction testaction = (TestAction) action;
+        testaction.setCollection(list);
+
+        InputTransferSelectTag tag = new InputTransferSelectTag();
+        tag.setPageContext(pageContext);
+        tag.setDynamicAttribute(null, "input-name", "inputName");
+        tag.setDynamicAttribute(null, "collection-name", "collectionName");
+
+        tag.setName("collection");
+        tag.setList("collection");
+
+        tag.doStartTag();
+        tag.doEndTag();
+
+        verify(InputTransferSelectTagTest.class.getResource("inputtransferselect-2.txt"));
+    }
 }
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java
index d7e8bb1..0aec5a1 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java
@@ -525,4 +525,36 @@ public class OptionTransferSelectTagTest extends AbstractUITagTest {
         //System.out.println(writer.toString());
         verify(OptionTransferSelectTagTest.class.getResource("optiontransferselect-7.txt"));
     }
+
+    public void testDynamicAttributes() throws Exception {
+        List left = new ArrayList();
+        left.add("Left1");
+        left.add("Left2");
+
+        List right = new ArrayList();
+        right.add("Right1");
+        right.add("Right2");
+
+        TestAction testaction = (TestAction) action;
+        testaction.setCollection(left);
+        testaction.setList2(right);
+
+        OptionTransferSelectTag tag = new OptionTransferSelectTag();
+        tag.setPageContext(pageContext);
+
+        tag.setName("collection");
+        tag.setList("collection");
+
+        tag.setDoubleName("list2");
+        tag.setDoubleList("list2");
+
+        tag.setDynamicAttribute(null, "left-name", "leftName");
+        tag.setDynamicAttribute(null, "right-name", "rightName");
+
+        tag.doStartTag();
+        tag.doEndTag();
+
+        //System.out.println(writer.toString());
+        verify(OptionTransferSelectTagTest.class.getResource("optiontransferselect-8.txt"));
+    }
 }
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt
new file mode 100644
index 0000000..23cf7f2
--- /dev/null
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt
@@ -0,0 +1,39 @@
+<select name="someName" disabled="disabled" tabindex="99" id="someId" class="cssClass1" style="cssStyle1"
+  title="someTitle" onclick="onclick1" ondblclick="ondblclick1" onmousedown="onmousedown1" onmouseup="onmouseup1"
+  onmouseover="onmouseover1" onmousemove="onmousemove1" onmouseout="onmouseout1" onfocus="onfocus1" onblur="onblur1"
+  onkeypress="onkeypress1" onkeydown="onkeydown1" onkeyup="onkeyup1" onselect="onchange"
+  onchange="someIdRedirect(this.selectedIndex)" first-name="firstName">
+  <option value="BE">Belgium</option>
+  <option value="FR" selected="selected">France</option>
+</select>
+<br />
+<select name="region" disabled="disabled" id="region" title="someTitle" second-name="secondName"></select>
+<script type="text/javascript">
+  var someIdGroup = newArray(2 + 0);
+  for (var i = 0; i < (2 + 0); i++) {
+    someIdGroup[i] = [];
+  }
+  someIdGroup[0][0] = newOption("Antwerp", "AN");
+  someIdGroup[0][1] = newOption("Gent", "GN");
+  someIdGroup[0][2] = newOption("Brugge", "BRG");
+  someIdGroup[1][0] = newOption("Paris", "PA");
+  someIdGroup[1][1] = newOption("Bordeaux", "BOR");
+  var someIdTemp = document.inputForm.region;
+  someIdRedirect(1);
+  function someIdRedirect(x) {
+    var selected = false;
+    for (var m = someIdTemp.options.length - 1; m >= 0; m--) {
+      someIdTemp.remove(m);
+    }
+    for (var i = 0; i < someIdGroup[x].length; i++) {
+      someIdTemp.options[i] = newOption(someIdGroup[x][i].text, someIdGroup[x][i].value);
+      if (someIdTemp.options[i].value == 'BOR') {
+        someIdTemp.options[i].selected = true;
+        selected = true;
+      }
+    }
+    if ((someIdTemp.options.length > 0) && (!selected)) {
+      someIdTemp.options[0].selected = true;
+    }
+  }
+</script>
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt
new file mode 100644
index 0000000..264fb6b
--- /dev/null
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt
@@ -0,0 +1,30 @@
+<tr>
+  <td class="tdLabel"></td>
+  <td class="tdInput">
+    <script type="text/javascript" src="/struts/inputtransferselect.js"></script>
+    <table>
+      <tr>
+        <td><input type="text" name="collection_input" id="collection_input" input-name="inputName"/></td>
+        <td class="tdTransferSelect">
+          <input type="button" value="-&gt;"
+            onclick="addOption(document.getElementById('collection_input'),document.getElementById('collection'))" />
+          <br /><br />
+          <input type="button" value="&lt;-" onclick="removeOptions(document.getElementById('collection'))" />
+          <br /><br />
+          <input type="button" value="&lt;&lt;--" onclick="removeAllOptions(document.getElementById('collection'))" />
+          <br />
+          <br />
+        </td>
+        <td>
+          <select name="collection" size="5" id="collection" multiple="multiple" collection-name="collectionName">
+            <option value="ItemOne" selected="selected">ItemOne</option>
+            <option value="ItemTwo" selected="selected">ItemTwo</option>
+          </select>
+          <input type="hidden" id="__multiselect_collection" name="__multiselect_collection" value="" />
+          <input type="button" onclick="moveOptionDown(document.getElementById('collection'),'key','');" value="v" />
+          <input type="button" onclick="moveOptionUp(document.getElementById('collection'),'key','');" value="^" />
+        </td>
+      </tr>
+    </table>
+  </td>
+</tr>
diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt
new file mode 100644
index 0000000..06cfd1c
--- /dev/null
+++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt
@@ -0,0 +1,50 @@
+<tr>
+  <td class="tdLabel"></td>
+  <td class="tdInput">
+    <script type="text/javascript" src="/struts/optiontransferselect.js"></script>
+    <table>
+      <tr>
+        <td>
+          <select name="collection" size="15" id="collection" multiple="multiple" left-name="leftName">
+            <option value="Left1" selected="selected">Left1</option>
+            <option value="Left2" selected="selected">Left2</option>
+          </select>
+          <input type="hidden" id="__multiselect_collection" name="__multiselect_collection" value="" />
+          <input type="button" onclick="moveOptionDown(document.getElementById('collection'),'key',''); " value="v" />
+          <input type="button" onclick="moveOptionUp(document.getElementById('collection'),'key',''); " value="^" />
+        </td>
+        <td class="tdTransferSelect">
+          <input type="button" value="<-"
+            onclick="moveSelectedOptions(document.getElementById('list2'),document.getElementById('collection'),false,'');" />
+          <br />
+          <br />
+          <input type="button" value="->"
+            onclick="moveSelectedOptions(document.getElementById('collection'),document.getElementById('list2'),false,'');" />
+          <br />
+          <br />
+          <input type="button" value="<<--"
+            onclick="moveAllOptions(document.getElementById('list2'),document.getElementById('collection'),false,'');" />
+          <br />
+          <br />
+          <input type="button" value="-->>"
+            onclick="moveAllOptions(document.getElementById('collection'),document.getElementById('list2'),false,'');" />
+          <br />
+          <br />
+          <input type="button" value="<*>"
+            onclick="selectAllOptions(document.getElementById('collection'));selectAllOptions(document.getElementById('list2'));" />
+          <br />
+          <br />
+        </td>
+        <td>
+          <select name="list2" size="15" multiple="multiple" id="list2" right-name="rightName">
+            <option value="Right1" selected="selected">Right1</option>
+            <option value="Right2" selected="selected">Right2</option>
+          </select>
+          <input type="hidden" id="__multiselect_list2" name="__multiselect_list2" value="" />
+          <input type="button" onclick="moveOptionDown(document.getElementById('list2'),'key','');" value="v" />
+          <input type="button" onclick="moveOptionUp(document.getElementById('list2'),'key','');" value="^" />
+        </td>
+      </tr>
+    </table>
+  </td>
+</tr>

[struts] 03/03: WW-5129 Simplifies excluding ignored keys with ?filter

Posted by lu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch WW-5129-dynamic-attributes
in repository https://gitbox.apache.org/repos/asf/struts.git

commit e098c5a2c38f6e2b206aba4625849b05a0b57c5f
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Wed Nov 10 08:33:47 2021 +0100

    WW-5129 Simplifies excluding ignored keys with ?filter
---
 .../template/simple/dynamic-attributes.ftl         | 25 +++++++++-------------
 .../freemarker/FreemarkerResultMockedTest.java     | 13 ++---------
 2 files changed, 12 insertions(+), 26 deletions(-)

diff --git a/core/src/main/resources/template/simple/dynamic-attributes.ftl b/core/src/main/resources/template/simple/dynamic-attributes.ftl
index fe82ac6..47a9113 100644
--- a/core/src/main/resources/template/simple/dynamic-attributes.ftl
+++ b/core/src/main/resources/template/simple/dynamic-attributes.ftl
@@ -18,27 +18,22 @@
  * under the License.
  */
 -->
+<#function acceptKey(key)>
+  <#if dynamic_attributes_ignore??>
+    <#return !key?starts_with(dynamic_attributes_ignore) >
+  <#else>
+    <#return true>
+  </#if>
+</#function>
 <#if (parameters.dynamicAttributes?? && parameters.dynamicAttributes?size > 0)><#rt/>
 <#assign aKeys = parameters.dynamicAttributes.keySet()><#rt/>
-<#list aKeys as aKey><#rt/>
-<#if dynamic_attributes_ignore??>
-<#if !aKey?starts_with(dynamic_attributes_ignore)>
+<#list aKeys?filter(acceptKey) as aKey><#rt/>
 <#assign keyValue = parameters.dynamicAttributes.get(aKey)/>
 <#if keyValue?is_string>
-    <#assign value = struts.translateVariables(keyValue)!keyValue/>
+  <#assign value = struts.translateVariables(keyValue)!keyValue/>
 <#else>
-    <#assign value = keyValue?string/>
+  <#assign value = keyValue?string/>
 </#if>
  ${aKey}="${value}"<#rt/>
-</#if>
-<#else>
-<#assign keyValue = parameters.dynamicAttributes.get(aKey)/>
-<#if keyValue?is_string>
-    <#assign value = struts.translateVariables(keyValue)!keyValue/>
-<#else>
-    <#assign value = keyValue?string/>
-</#if>
- ${aKey}="${value}"<#rt/>
-</#if>
 </#list><#rt/>
 </#if><#rt/>
diff --git a/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java
index a78bcf1..99cd484 100644
--- a/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java
+++ b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerResultMockedTest.java
@@ -113,12 +113,7 @@ public class FreemarkerResultMockedTest extends StrutsInternalTestCase {
         ActionMapping mapping = container.getInstance(ActionMapper.class).getMapping(request, configurationManager);
         dispatcher.serviceAction(request, response, mapping);
 
-        String expectedJDK17 =
-            "<input type=\"text\" name=\"test\" value=\"\" id=\"test\" placeholder=\"input\" foo=\"bar\"/>"
-                + "<input type=\"text\" name=\"test\" value=\"\" id=\"test\" placeholder=\"input\" foo=\"bar\"/>"
-                + "<input type=\"text\" name=\"test\" value=\"\" id=\"test\" break=\"true\"/>"
-                + "<input type=\"text\" name=\"required\" value=\"\" id=\"required\" required=\"true\"/>";
-        String expectedJDK18 =
+        String expected =
             "<input type=\"text\" name=\"test\" value=\"\" id=\"test\" foo=\"bar\" placeholder=\"input\"/>"
                 + "<input type=\"text\" name=\"test\" value=\"\" id=\"test\" foo=\"bar\" placeholder=\"input\"/>"
                 + "<input type=\"text\" name=\"test\" value=\"\" id=\"test\" break=\"true\"/>"
@@ -126,11 +121,7 @@ public class FreemarkerResultMockedTest extends StrutsInternalTestCase {
 
         String result = stringWriter.toString();
 
-        if (result.contains("id=\"test\" foo=\"bar\"")) {
-            assertEquals(expectedJDK18, result);
-        } else {
-            assertEquals(expectedJDK17, result);
-        }
+        assertEquals(expected, result);
     }
 
     public void testManualListInTemplate() throws Exception {