You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2015/11/06 09:44:23 UTC

tapestry-5 git commit: TAP-2490: use the value encoder from the EventContext to convert client-side context values back

Repository: tapestry-5
Updated Branches:
  refs/heads/master 2b6debc3c -> 0619d96b4


TAP-2490: use the value encoder from the EventContext to convert client-side context values back


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

Branch: refs/heads/master
Commit: 0619d96b4006cb2108299163aaf8c958891408e0
Parents: 2b6debc
Author: Jochen Kemnade <jo...@eddyson.de>
Authored: Fri Nov 6 09:11:36 2015 +0100
Committer: Jochen Kemnade <jo...@eddyson.de>
Committed: Fri Nov 6 09:36:06 2015 +0100

----------------------------------------------------------------------
 .../tapestry5/corelib/components/Select.java    | 27 ++++--
 .../tapestry5/corelib/mixins/Autocomplete.java  | 33 +++++---
 .../corelib/components/SelectTest.java          | 87 ++++++++++++++++++++
 3 files changed, 126 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/0619d96b/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..9be23ab 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
@@ -18,6 +18,7 @@ import org.apache.tapestry5.corelib.base.AbstractField;
 import org.apache.tapestry5.corelib.data.BlankOption;
 import org.apache.tapestry5.corelib.data.SecureOption;
 import org.apache.tapestry5.corelib.mixins.RenderDisabled;
+import org.apache.tapestry5.internal.AbstractEventContext;
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.internal.TapestryInternalUtils;
 import org.apache.tapestry5.internal.util.CaptureResultCallback;
@@ -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,15 +272,25 @@ public class Select extends AbstractField
 
         CaptureResultCallback<Object> callback = new CaptureResultCallback<Object>();
 
-        Object[] newContext = new Object[context.size() + 1];
-        newContext[0] = newValue;
-        for (int i = 1; i < newContext.length; i++)
-        {
-            newContext[i] = context.get(i - 1);
-        }
 
+        EventContext newContext = new AbstractEventContext() {
+
+          @Override
+          public int getCount() {
+            return context.getCount() + 1;
+          }
+
+          @Override
+          public <T> T get(Class<T> desiredType, int index) {
+            if (index == 0)
+            {
+                return typeCoercer.coerce(newValue, desiredType);
+            }
+            return context.get(desiredType, index-1);
+          }
+        };
 
-        this.resources.triggerEvent(EventConstants.VALUE_CHANGED, newContext, callback);
+        this.resources.triggerContextEvent(EventConstants.VALUE_CHANGED, newContext, callback);
 
         this.value = newValue;
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/0619d96b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java
index 1dfcd3d..6284632 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/mixins/Autocomplete.java
@@ -14,6 +14,7 @@ package org.apache.tapestry5.corelib.mixins;
 
 import org.apache.tapestry5.*;
 import org.apache.tapestry5.annotations.*;
+import org.apache.tapestry5.internal.AbstractEventContext;
 import org.apache.tapestry5.internal.util.Holder;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
@@ -130,8 +131,8 @@ public class Autocomplete
         jsSupport.require("t5/core/autocomplete").with(spec);
     }
 
-    Object onAutocomplete(List<String> context, @RequestParameter("t:input")
-                          String input)
+    Object onAutocomplete(final EventContext context, @RequestParameter("t:input")
+                          final String input)
     {
         final Holder<List> matchesHolder = Holder.create();
 
@@ -151,19 +152,25 @@ public class Autocomplete
             }
         };
 
-        Object[] newContext;
-        if (context.size() == 0) {
-            newContext = new Object[] {input};
-        }
-        else {
-            newContext = new Object[context.size() + 1];
-            newContext[0] = input;
-            for (int i = 1; i < newContext.length; i++) {
-                newContext[i] = context.get(i - 1);
+        EventContext newContext = new AbstractEventContext() {
+
+          @Override
+          public int getCount() {
+            return context.getCount() + 1;
+          }
+
+          @Override
+          public <T> T get(Class<T> desiredType, int index) {
+            if (index == 0)
+            {
+                return coercer.coerce(input, desiredType);
             }
-        }
+            return context.get(desiredType, index-1);
+          }
+        };
+
         
-        resources.triggerEvent(EventConstants.PROVIDE_COMPLETIONS, newContext, callback);
+        resources.triggerContextEvent(EventConstants.PROVIDE_COMPLETIONS, newContext, callback);
 
         JSONObject reply = new JSONObject();
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/0619d96b/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/SelectTest.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/SelectTest.java b/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/SelectTest.java
index f96e957..6456384 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/SelectTest.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/corelib/components/SelectTest.java
@@ -13,6 +13,7 @@
 package org.apache.tapestry5.corelib.components;
 
 import org.apache.tapestry5.*;
+import org.apache.tapestry5.corelib.components.SelectTest.Platform;
 import org.apache.tapestry5.corelib.data.BlankOption;
 import org.apache.tapestry5.corelib.data.SecureOption;
 import org.apache.tapestry5.dom.XMLMarkupModel;
@@ -21,6 +22,8 @@ import org.apache.tapestry5.internal.OptionGroupModelImpl;
 import org.apache.tapestry5.internal.OptionModelImpl;
 import org.apache.tapestry5.internal.SelectModelImpl;
 import org.apache.tapestry5.internal.TapestryInternalUtils;
+import org.apache.tapestry5.internal.URLEventContext;
+import org.apache.tapestry5.internal.services.ContextValueEncoderImpl;
 import org.apache.tapestry5.internal.services.MarkupWriterImpl;
 import org.apache.tapestry5.internal.services.StringValueEncoder;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
@@ -28,11 +31,14 @@ import org.apache.tapestry5.internal.util.Holder;
 import org.apache.tapestry5.ioc.Messages;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
+import org.apache.tapestry5.services.ContextValueEncoder;
 import org.apache.tapestry5.services.Request;
 import org.apache.tapestry5.services.ValueEncoderSource;
 import org.apache.tapestry5.util.EnumSelectModel;
+import org.apache.tapestry5.util.EnumValueEncoder;
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
+import org.easymock.IArgumentMatcher;
 import org.testng.annotations.Test;
 
 import java.io.BufferedInputStream;
@@ -644,4 +650,85 @@ public class SelectTest extends InternalBaseTestCase
 
     }
 
+    @Test
+    public void context_that_needs_to_be_encoded() throws Exception
+    {
+
+        ValueEncoderSource valueEncoderSource = mockValueEncoderSource();
+
+        TypeCoercer typeCoercer = getService(TypeCoercer.class);
+
+        ContextValueEncoder contextValueEncoder = new ContextValueEncoderImpl(valueEncoderSource);
+
+        ValueEncoder<Platform> platformEncoder = new ValueEncoder<SelectTest.Platform>() {
+
+          @Override
+          public Platform toValue(String clientValue) {
+            return Platform.valueOf(clientValue.substring(10));
+          }
+
+          @Override
+          public String toClient(Platform value) {
+            return "Platform: "+value.name();
+          }
+        };
+
+        InternalComponentResources resources = mockInternalComponentResources();
+        expect(valueEncoderSource.getValueEncoder(Platform.class)).andReturn(platformEncoder).anyTimes();
+        expect(valueEncoderSource.getValueEncoder(String.class)).andReturn(new StringValueEncoder()).anyTimes();
+
+        expect(resources.triggerContextEvent(EasyMock.eq(EventConstants.VALUE_CHANGED), eqEventContext(null, Platform.LINUX), EasyMock.isA(ComponentEventCallback.class))).andReturn(true);
+
+
+        Select select = new Select();
+
+        set(select, "resources", resources);
+        set(select, "encoder", new StringValueEncoder());
+        set(select, "typeCoercer", typeCoercer);
+
+        replay();
+
+        select.onChange(new URLEventContext(contextValueEncoder, new String[]{platformEncoder.toClient(Platform.LINUX)}), null);
+
+        verify();
+    }
+
+    private static EventContext eqEventContext(final Object ... expectedContext)
+    {
+      EasyMock.reportMatcher(new IArgumentMatcher() {
+
+        @Override
+        public boolean matches(Object argument)
+        {
+          EventContext context = (EventContext) argument;
+          for (int i = 0; i < expectedContext.length; i++)
+          {
+            Object expected = expectedContext[i];
+            Class expectedClass = expected == null ? Object.class : expected.getClass();
+
+            if (!TapestryInternalUtils.isEqual(context.get(expectedClass, i), expected))
+            {
+                return false;
+            }
+          }
+          return true;
+        }
+
+        @Override
+        public void appendTo(StringBuffer buffer)
+        {
+          buffer.append("expected event context [");
+          for (int i = 0; i < expectedContext.length; i++)
+          {
+            if (i != 0)
+            {
+              buffer.append(", ");
+            }
+            buffer.append(expectedContext[i]);
+          }
+          buffer.append("]");
+        }
+      });
+      return null;
+    }
 }