Author: ivaynberg
Date: Tue Jan 29 17:42:20 2008
New Revision: 616580

URL: http://svn.apache.org/viewvc?rev=616580&view=rev
Log:
allow encoding of extra parameters when generating request listener interface 
urls

Modified:
    
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java

Modified: 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java?rev=616580&r1=616579&r2=616580&view=diff
==============================================================================
--- 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java 
(original)
+++ 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java 
Tue Jan 29 17:42:20 2008
@@ -18,11 +18,14 @@
 
 import java.io.Serializable;
 import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.wicket.behavior.IBehavior;
 import org.apache.wicket.protocol.http.BufferedWebResponse;
 import org.apache.wicket.protocol.http.IRequestLogger;
 import org.apache.wicket.protocol.http.PageExpiredException;
+import org.apache.wicket.protocol.http.RequestUtils;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
 import org.apache.wicket.request.AbstractRequestCycleProcessor;
 import org.apache.wicket.request.ClientInfo;
@@ -38,6 +41,7 @@
 import 
org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget;
 import org.apache.wicket.request.target.resource.SharedResourceRequestTarget;
 import org.apache.wicket.util.collections.ArrayListStack;
+import org.apache.wicket.util.string.AppendingStringBuffer;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.time.Time;
 import org.apache.wicket.util.value.ValueMap;
@@ -273,7 +277,7 @@
         *            The response
         */
        protected RequestCycle(final Application application, final Request 
request,
-                       final Response response)
+               final Response response)
        {
                this.application = application;
                this.request = request;
@@ -684,10 +688,10 @@
         *            The pagemap in which the response page should be created
         */
        public final void setResponsePage(final Class pageClass, final 
PageParameters pageParameters,
-                       final String pageMapName)
+               final String pageMapName)
        {
                IRequestTarget target = new 
BookmarkablePageRequestTarget(pageMapName, pageClass,
-                               pageParameters);
+                       pageParameters);
                setRequestTarget(target);
        }
 
@@ -709,7 +713,7 @@
        public String toString()
        {
                return "[RequestCycle" + "@" + Integer.toHexString(hashCode()) 
+ " thread=" +
-                               Thread.currentThread().getName() + "]";
+                       Thread.currentThread().getName() + "]";
        }
 
        /**
@@ -777,13 +781,13 @@
         * @return A URL that encodes a page, component, behavior and interface 
to call
         */
        public final CharSequence urlFor(final Component component, final 
IBehavior behaviour,
-                       final RequestListenerInterface listener)
+               final RequestListenerInterface listener)
        {
                int index = component.getBehaviors().indexOf(behaviour);
                if (index == -1)
                {
                        throw new IllegalArgumentException("Behavior " + this +
-                                       " was not registered with this 
component: " + component.toString());
+                               " was not registered with this component: " + 
component.toString());
                }
                RequestParameters params = new RequestParameters();
                params.setBehaviorId(String.valueOf(index));
@@ -800,7 +804,7 @@
                }
 
                final IRequestTarget target = new 
BehaviorRequestTarget(component.getPage(), component,
-                               listener, params);
+                       listener, params);
                return encodeUrlFor(target);
        }
 
@@ -813,22 +817,40 @@
         *            The component to reference
         * @param listener
         *            The listener interface on the component
+        * @param params
+        *            Additional parameters to pass to the page
         * @return A URL that encodes a page, component and interface to call
         */
        public final CharSequence urlFor(final Component component,
-                       final RequestListenerInterface listener)
+               final RequestListenerInterface listener, ValueMap params)
        {
                // Get Page holding component and mark it as stateful.
                final Page page = component.getPage();
                final IRequestTarget target;
                if (listener != IRedirectListener.INTERFACE && 
component.isStateless() &&
-                               page.isBookmarkable())
+                       page.isBookmarkable())
                {
                        PageParameters pageParameters = 
page.getPageParameters();
                        if (pageParameters == null)
+                       {
                                pageParameters = new PageParameters();
-                       target = new 
BookmarkableListenerInterfaceRequestTarget(page.getPageMapName(), page
-                                       .getClass(), pageParameters, component, 
listener);
+                       }
+
+                       if (params != null)
+                       {
+                               Iterator it = params.entrySet().iterator();
+                               while (it.hasNext())
+                               {
+                                       final Map.Entry entry = 
(Entry)it.next();
+                                       final String key = 
entry.getKey().toString();
+                                       final String value = 
entry.getValue().toString();
+                                       pageParameters.add(encode(key), 
encode(value));
+                               }
+                       }
+
+                       target = new 
BookmarkableListenerInterfaceRequestTarget(page.getPageMapName(),
+                               page.getClass(), pageParameters, component, 
listener);
+                       return encodeUrlFor(target);
                }
                else
                {
@@ -843,8 +865,59 @@
 
                        // Get the listener interface name
                        target = new ListenerInterfaceRequestTarget(page, 
component, listener);
+
+                       CharSequence url = encodeUrlFor(target);
+
+                       if (params != null)
+                       {
+                               AppendingStringBuffer buff = new 
AppendingStringBuffer(url);
+                               Iterator it = params.entrySet().iterator();
+                               while (it.hasNext())
+                               {
+                                       final Map.Entry entry = 
(Entry)it.next();
+                                       final String key = 
entry.getKey().toString();
+                                       final String value = 
entry.getValue().toString();
+                                       buff.append("&");
+                                       buff.append(encode(key));
+                                       buff.append("=");
+                                       buff.append(encode(value));
+
+                               }
+
+                               url = buff;
+                       }
+                       return url;
                }
-               return encodeUrlFor(target);
+
+       }
+
+       /**
+        * Url encodes value using UTF-8
+        * 
+        * @param value
+        *            value to encode
+        * @return encoded value
+        */
+       private static String encode(String value)
+       {
+               return RequestUtils.encode(value);
+       }
+
+       /**
+        * Returns a URL that references a given interface on a component. When 
the URL is requested
+        * from the server at a later time, the interface will be called. A URL 
returned by this method
+        * will not be stable across sessions and cannot be bookmarked by a 
user.
+        * 
+        * @param component
+        *            The component to reference
+        * @param listener
+        *            The listener interface on the component
+        * @return A URL that encodes a page, component and interface to call
+        */
+       public final CharSequence urlFor(final Component component,
+               final RequestListenerInterface listener)
+       {
+               return urlFor(component, listener, null);
        }
 
        /**
@@ -861,11 +934,10 @@
         * @return Bookmarkable URL to page
         */
        public final CharSequence urlFor(final IPageMap pageMap, final Class 
pageClass,
-                       final PageParameters parameters)
+               final PageParameters parameters)
        {
                final IRequestTarget target = new 
BookmarkablePageRequestTarget(pageMap == null
-                               ? PageMap.DEFAULT_NAME
-                               : pageMap.getName(), pageClass, parameters);
+                       ? PageMap.DEFAULT_NAME : pageMap.getName(), pageClass, 
parameters);
                return encodeUrlFor(target);
        }
 
@@ -923,7 +995,7 @@
                RequestParameters requestParameters = new RequestParameters();
                
requestParameters.setResourceKey(resourceReference.getSharedResourceKey());
                if 
(getApplication().getResourceSettings().getAddLastModifiedTimeToResourceReferenceUrl()
 &&
-                               !Strings.isEmpty(resourceReference.getName()))
+                       !Strings.isEmpty(resourceReference.getName()))
                {
                        Time time = resourceReference.lastModifiedTime();
                        if (time != null)
@@ -950,8 +1022,8 @@
                {
                        detach();
                        throw new WicketRuntimeException(
-                                       "RequestCycles are non-reusable 
objects. This instance (" + this +
-                                                       ") already executed");
+                               "RequestCycles are non-reusable objects. This 
instance (" + this +
+                                       ") already executed");
                }
        }
 
@@ -1021,7 +1093,7 @@
                        catch (RuntimeException re)
                        {
                                log.error("there was an error detaching the 
request from the session " + session +
-                                               ".", re);
+                                       ".", re);
                        }
                }
 
@@ -1149,14 +1221,14 @@
                                case RESOLVE_TARGET : {
                                        // resolve the target of the request 
using the request
                                        // parameters
-                                       final IRequestTarget target = 
processor.resolve(this, request
-                                                       
.getRequestParameters());
+                                       final IRequestTarget target = 
processor.resolve(this,
+                                               request.getRequestParameters());
 
                                        // has to result in a request target
                                        if (target == null)
                                        {
                                                throw new 
WicketRuntimeException(
-                                                               "the processor 
did not resolve to any request target");
+                                                       "the processor did not 
resolve to any request target");
                                        }
                                        // Add (inserting at the bottom) in 
case before or during
                                        // target resolving one or more request 
targets were pushed
@@ -1210,8 +1282,7 @@
                        {
                                // hmmm, we were already handling an exception! 
give up
                                log.error(
-                                               "unexpected exception when 
handling another exception: " + e.getMessage(),
-                                               e);
+                                       "unexpected exception when handling 
another exception: " + e.getMessage(), e);
                        }
                }
        }
@@ -1238,7 +1309,7 @@
                                if (totalSteps >= maxSteps)
                                {
                                        throw new 
IllegalStateException("Request processing executed " + maxSteps +
-                                                       " steps, which means it 
is probably in an infinite loop.");
+                                               " steps, which means it is 
probably in an infinite loop.");
                                }
                                try
                                {


Reply via email to