You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2015/11/05 16:21:53 UTC

tapestry-5 git commit: TAP5-2490: the context values are encoded using the encoder, so we also need to use it to decode them

Repository: tapestry-5
Updated Branches:
  refs/heads/master 18ea65471 -> b72b0e100


TAP5-2490: the context values are encoded using the encoder, so we also need to use it to decode them


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/b72b0e10
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/b72b0e10
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/b72b0e10

Branch: refs/heads/master
Commit: b72b0e100e72c482294f418919f6f4aa7f57c6d3
Parents: 18ea654
Author: Jochen Kemnade <jo...@eddyson.de>
Authored: Thu Nov 5 16:06:47 2015 +0100
Committer: Jochen Kemnade <jo...@eddyson.de>
Committed: Thu Nov 5 16:06:47 2015 +0100

----------------------------------------------------------------------
 .../tapestry5/corelib/components/Select.java    |  7 +-
 tapestry-core/src/test/app1/SelectDemo.tml      | 17 +++-
 .../tapestry5/integration/app1/FormTests.java   | 12 +++
 .../integration/app1/pages/SelectDemo.java      | 89 ++++++++++++++++++++
 4 files changed, 121 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
index 3f5a7f4..993c3a8 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Select.java
@@ -20,6 +20,7 @@ import org.apache.tapestry5.corelib.data.SecureOption;
 import org.apache.tapestry5.corelib.mixins.RenderDisabled;
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.internal.TapestryInternalUtils;
+import org.apache.tapestry5.internal.services.ArrayEventContext;
 import org.apache.tapestry5.internal.util.CaptureResultCallback;
 import org.apache.tapestry5.internal.util.SelectModelRenderer;
 import org.apache.tapestry5.ioc.Messages;
@@ -263,7 +264,7 @@ public class Select extends AbstractField
         }
     }
 
-    Object onChange(final List<Object> context,
+    Object onChange(final EventContext context,
                     @RequestParameter(value = "t:selectvalue", allowBlank = true) final String selectValue)
             throws ValidationException
     {
@@ -271,11 +272,11 @@ public class Select extends AbstractField
 
         CaptureResultCallback<Object> callback = new CaptureResultCallback<Object>();
 
-        Object[] newContext = new Object[context.size() + 1];
+        Object[] newContext = new Object[context.getCount() + 1];
         newContext[0] = newValue;
         for (int i = 1; i < newContext.length; i++)
         {
-            newContext[i] = context.get(i - 1);
+            newContext[i] = encoder.toValue(context.get(String.class, i - 1));
         }
 
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/test/app1/SelectDemo.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/app1/SelectDemo.tml b/tapestry-core/src/test/app1/SelectDemo.tml
index 60a27d4..9e528a0 100644
--- a/tapestry-core/src/test/app1/SelectDemo.tml
+++ b/tapestry-core/src/test/app1/SelectDemo.tml
@@ -8,7 +8,6 @@
 			:
 			<t:select t:id="color" validate="required" blankOption="always"
 				model="literal:Red,Green,Blue" />
-
 		</p>
 		<p>
 			<t:label for="month" />
@@ -24,5 +23,21 @@
 
 	<p> Selected color: ${color}</p>
 	<p> Selected month: ${month}</p>
+	
+	<t:zone>
+		<t:form>
+	
+			<p>
+				<t:label for="number" />
+				:
+				<t:select t:id="number" zone="^"
+					model="numbermodel" context="numbercontext" encoder="numberencoder" />
+			</p>
+	
+		</t:form>
+		
+		<p> Selected number: ${number}</p>
+		<p> Selected number context: ${selectedNumberContext}</p>
+	</t:zone>
 
 </t:border>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java
index 85a3690..553342d 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/FormTests.java
@@ -1264,4 +1264,16 @@ public class FormTests extends App1TestCase
 
         assertTextPresent("Selected month: August");
     }
+    
+    @Test
+    // TAP5-2490
+    public void select_with_url_encoded_context() throws Exception
+    {
+        openLinks("Select Demo");
+
+        select("number", "label=2");
+
+        assertTextPresent("Selected number: 2");
+        assertTextPresent("Selected number context: 23");
+    }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/b72b0e10/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java
index 00c5219..dad93f0 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/SelectDemo.java
@@ -13,6 +13,8 @@
 // limitations under the License.
 package org.apache.tapestry5.integration.app1.pages;
 
+import java.util.List;
+
 import org.apache.tapestry5.PersistenceConstants;
 import org.apache.tapestry5.SelectModel;
 import org.apache.tapestry5.annotations.Persist;
@@ -20,6 +22,15 @@ import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.internal.OptionModelImpl;
 import org.apache.tapestry5.internal.SelectModelImpl;
 
+import org.apache.tapestry5.EventConstants;
+import org.apache.tapestry5.ValueEncoder;
+import org.apache.tapestry5.annotations.InjectComponent;
+import org.apache.tapestry5.annotations.OnEvent;
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.corelib.components.Zone;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+
 public class SelectDemo
 {
 
@@ -30,6 +41,11 @@ public class SelectDemo
     @Property
     @Persist
     private String month;
+    
+    @Property
+    @Persist
+    private NumberContainer number;
+
 
     @Property
     @Persist(PersistenceConstants.FLASH)
@@ -53,4 +69,77 @@ public class SelectDemo
           );
     }
 
+
+    @Property
+    @Persist
+    private NumberContainer selectedNumberContext;
+    
+    @InjectComponent
+    private Zone zone;
+
+    public List<NumberContainer> getNumberModel(){
+      return CollectionFactory.newList(new NumberContainer(1), new NumberContainer(2));
+    }
+
+    public ValueEncoder<NumberContainer> getNumberEncoder(){
+      return new ValueEncoder<NumberContainer>() {
+
+        @Override
+        public String toClient(NumberContainer value) {
+          return Integer.toString(value.number);
+        }
+
+        @Override
+        public NumberContainer toValue(String clientValue) {
+           return new NumberContainer(Integer.parseInt(clientValue));
+        }
+      };
+    }
+
+    public NumberContainer getNumberContext(){
+      return new NumberContainer(23);
+    }
+
+    @OnEvent(value=EventConstants.VALUE_CHANGED, component="number")
+    Object onValueChangedFromNumber(NumberContainer number, NumberContainer context){
+      selectedNumberContext = context;
+      return zone.getBody();
+    }
+    
+    public static final class NumberContainer {
+      
+      public NumberContainer(int number) {
+        this.number = number;
+      }
+      
+      public final int number;
+
+      @Override
+      public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + number;
+        return result;
+      }
+
+      @Override
+      public boolean equals(Object obj) {
+        if (this == obj)
+          return true;
+        if (obj == null)
+          return false;
+        if (getClass() != obj.getClass())
+          return false;
+        NumberContainer other = (NumberContainer) obj;
+        if (number != other.number)
+          return false;
+        return true;
+      }
+
+      @Override
+      public String toString() {
+        return Integer.toString(number);
+      }
+      
+    }
 }