You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2010/01/25 19:02:40 UTC

svn commit: r902896 - /wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/request/target/coding/MixedParamHybridUrlCodingStrategy.java

Author: ivaynberg
Date: Mon Jan 25 18:02:39 2010
New Revision: 902896

URL: http://svn.apache.org/viewvc?rev=902896&view=rev
Log:
WICKET-2685
Issue: WICKET-2685

Modified:
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/request/target/coding/MixedParamHybridUrlCodingStrategy.java

Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/request/target/coding/MixedParamHybridUrlCodingStrategy.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/request/target/coding/MixedParamHybridUrlCodingStrategy.java?rev=902896&r1=902895&r2=902896&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/request/target/coding/MixedParamHybridUrlCodingStrategy.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/request/target/coding/MixedParamHybridUrlCodingStrategy.java Mon Jan 25 18:02:39 2010
@@ -20,22 +20,22 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.wicket.Page;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.RequestCycle;
-import org.apache.wicket.Page;
 import org.apache.wicket.protocol.http.WebRequest;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.value.ValueMap;
-import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
-
-import javax.servlet.http.HttpServletRequest;
+import org.slf4j.LoggerFactory;
 
 /**
  * Url coding strategy for bookmarkable pages with Ajax components that encodes a set of given
- * parameters in the url's path and the rest in the query-string. In addition, the page version
- * is added to the end of the url's path.
+ * parameters in the url's path and the rest in the query-string. In addition, the page version is
+ * added to the end of the url's path.
  * <p/>
  * Strategy looks for path-parameters whose name is read from an array of names e.g. ["param0",
  * "param1"]. Found parameters will be appended to the url in the form
@@ -48,179 +48,196 @@
  * encode. For example, the names for the path parameters are: "a", "b" and "c". When "b" is not
  * specified upon encoding, but "c" is, upon a decode "b" will get the empty string as value. When
  * both "b" and "c" are missing on encode, the will not get a value during decode.
- *
+ * 
  * @author erik.van.oosten
  * @see MixedParamUrlCodingStrategy
  */
 public class MixedParamHybridUrlCodingStrategy extends HybridUrlCodingStrategy
 {
-    private static Logger logger = LoggerFactory.getLogger(MixedParamHybridUrlCodingStrategy.class);
+	private static Logger logger = LoggerFactory.getLogger(MixedParamHybridUrlCodingStrategy.class);
 
-    private final String[] parameterNames;
-    private boolean ignoreUndeclaredParameters = true;
+	private final String[] parameterNames;
+	private boolean ignoreUndeclaredParameters = true;
 
-    /**
-     * Construct.
-     *
-     * @param mountPath mount path
-     * @param pageClass class of mounted page
-     * @param redirectOnBookmarkableRequest
-     *            whether after hitting the page with URL in bookmarkable form it should be
-     *            redirected to hybrid URL - needed for ajax to work properly after page refresh
-     * @param parameterNames the parameter names (not null)
-     */
-    public MixedParamHybridUrlCodingStrategy(
-            String mountPath, Class<? extends Page> pageClass,
-            boolean redirectOnBookmarkableRequest, String[] parameterNames)
-    {
-        super(mountPath, pageClass, redirectOnBookmarkableRequest);
-        this.parameterNames = parameterNames;
-    }
-
-    /**
-     * Construct.
-     *
-     * @param mountPath mount path
-     * @param pageClass class of mounted page
-     * @param parameterNames the parameter names (not null)
-     */
-    public MixedParamHybridUrlCodingStrategy(String mountPath, Class<? extends Page> pageClass, String[] parameterNames)
-    {
-        super(mountPath, pageClass);
-        this.parameterNames = parameterNames;
-    }
-
-    /**
-     * @param ignoreUndeclaredParameters true to ignore undeclared parameters in
-     *            the URL (still logged), false to throw an exception when this
-     *            happens (default is true)
-     * @return this
-     */
-    public MixedParamHybridUrlCodingStrategy setIgnoreUndeclaredParameters(boolean ignoreUndeclaredParameters)
-    {
-        this.ignoreUndeclaredParameters = ignoreUndeclaredParameters;
-        return this;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters)
-    {
-        if (!url.endsWith("/"))
-        {
-            url.append("/");
-        }
-
-        Set<String> parameterNamesToAdd = new HashSet<String>(parameters.keySet());
-
-        // Find index of last specified parameter
-        boolean foundParameter = false;
-        int lastSpecifiedParameter = parameterNames.length;
-        while (lastSpecifiedParameter != 0 && !foundParameter)
-        {
-            foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]);
-        }
-
-        if (foundParameter) {
-            for (int i = 0; i <= lastSpecifiedParameter; i++)
-            {
-                String parameterName = parameterNames[i];
-                final Object param = parameters.get(parameterName);
-                String value = param instanceof String[] ? ((String[])param)[0] : (String)param;
-                if (value == null)
-                {
-                    value = "";
-                }
-                if (!url.endsWith("/"))
-                {
-                    url.append("/");
-                }
-                url.append(urlEncodePathComponent(value));
-                parameterNamesToAdd.remove(parameterName);
-            }
-        }
-
-        if (!parameterNamesToAdd.isEmpty())
-        {
-            boolean first = true;
-            for (String parameterName : parameterNamesToAdd)
-            {
-                url.append(first ? '?' : '&');
-                 final Object param = parameters.get(parameterName);
-                String value = param instanceof String[] ? ((String[])param)[0] : String.valueOf(param);
-                url.append(urlEncodeQueryComponent(parameterName)).append("=").append(urlEncodeQueryComponent(value));
-                first = false;
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected String addPageInfo(String url, PageInfo pageInfo)
-    {
-        if (pageInfo == null)
-        {
-            return url;
-        }
-        else
-        {
-            // Insert the page info at the and of the path and before the querystring.
-            if (url.indexOf('?') == -1)
-            {
-                return url + getBeginSeparator() + pageInfo.toString() + getEndSeparator();
-            }
-            else
-            {
-                return Strings.firstPathComponent(url, '?') + getBeginSeparator() + pageInfo.toString() + getEndSeparator() + '?' + Strings.afterFirstPathComponent(url, '?');
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected ValueMap decodeParameters(String urlFragment, Map<String, ?> urlParameters)
-    {
-        PageParameters params = new PageParameters();
-        // Add all url parameters
-        params.putAll(urlParameters);
-        String urlPath = urlFragment;
-        if (urlPath.startsWith("/"))
-        {
-            urlPath = urlPath.substring(1);
-        }
-
-        if (urlPath.length() > 0)
-        {
-            String[] pathParts = urlPath.split("/");
-            if (pathParts.length > parameterNames.length)
-            {
-                // Some known causes of this situation:
-                // - user edits the URL manually
-                // - a javascript requests resources relative to the current page instead of to the web context
-                String msg = String.format("Found more URL path parts then expected, these will be ignored. Url: '%s', mountpath: '%s', urlPath: '%s', expected %d parameters was %d", getRequestUrl(), getMountPath(), urlPath, parameterNames.length, pathParts.length);
-                if (ignoreUndeclaredParameters)
-                {
-                    logger.info(msg);
-                }
-                else
-                {
-                    throw new IllegalArgumentException(msg);
-                }
-            }
-
-            int actualParameterCount = Math.min(pathParts.length, parameterNames.length);
-            for (int i = 0; i < actualParameterCount; i++)
-            {
-                params.put(parameterNames[i], urlDecodePathComponent(pathParts[i]));
-            }
-        }
-
-        return params;
-    }
-
-    private String getRequestUrl()
-    {
-        HttpServletRequest request = ((WebRequest) RequestCycle.get().getRequest()).getHttpServletRequest();
-        return request.getRequestURL().toString();
-    }
+	/**
+	 * Construct.
+	 * 
+	 * @param mountPath
+	 *            mount path
+	 * @param pageClass
+	 *            class of mounted page
+	 * @param redirectOnBookmarkableRequest
+	 *            whether after hitting the page with URL in bookmarkable form it should be
+	 *            redirected to hybrid URL - needed for ajax to work properly after page refresh
+	 * @param parameterNames
+	 *            the parameter names (not null)
+	 */
+	public MixedParamHybridUrlCodingStrategy(String mountPath, Class<? extends Page> pageClass,
+		boolean redirectOnBookmarkableRequest, String[] parameterNames)
+	{
+		super(mountPath, pageClass, redirectOnBookmarkableRequest);
+		this.parameterNames = parameterNames;
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param mountPath
+	 *            mount path
+	 * @param pageClass
+	 *            class of mounted page
+	 * @param parameterNames
+	 *            the parameter names (not null)
+	 */
+	public MixedParamHybridUrlCodingStrategy(String mountPath, Class<? extends Page> pageClass,
+		String[] parameterNames)
+	{
+		super(mountPath, pageClass);
+		this.parameterNames = parameterNames;
+	}
+
+	/**
+	 * @param ignoreUndeclaredParameters
+	 *            true to ignore undeclared parameters in the URL (still logged), false to throw an
+	 *            exception when this happens (default is true)
+	 * @return this
+	 */
+	public MixedParamHybridUrlCodingStrategy setIgnoreUndeclaredParameters(
+		boolean ignoreUndeclaredParameters)
+	{
+		this.ignoreUndeclaredParameters = ignoreUndeclaredParameters;
+		return this;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters)
+	{
+		if (!url.endsWith("/"))
+		{
+			url.append("/");
+		}
+
+		Set<String> parameterNamesToAdd = new HashSet<String>(parameters.keySet());
+
+		// Find index of last specified parameter
+		boolean foundParameter = false;
+		int lastSpecifiedParameter = parameterNames.length;
+		while (lastSpecifiedParameter != 0 && !foundParameter)
+		{
+			foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]);
+		}
+
+		if (foundParameter)
+		{
+			for (int i = 0; i <= lastSpecifiedParameter; i++)
+			{
+				String parameterName = parameterNames[i];
+				final Object param = parameters.get(parameterName);
+				String value = param instanceof String[] ? ((String[])param)[0] : (param == null)
+					? null : param.toString();
+				if (value == null)
+				{
+					value = "";
+				}
+				if (!url.endsWith("/"))
+				{
+					url.append("/");
+				}
+				url.append(urlEncodePathComponent(value));
+				parameterNamesToAdd.remove(parameterName);
+			}
+		}
+
+		if (!parameterNamesToAdd.isEmpty())
+		{
+			boolean first = true;
+			for (String parameterName : parameterNamesToAdd)
+			{
+				url.append(first ? '?' : '&');
+				final Object param = parameters.get(parameterName);
+				String value = param instanceof String[] ? ((String[])param)[0] : (param == null)
+					? null : param.toString();
+				url.append(urlEncodeQueryComponent(parameterName)).append("=").append(
+					urlEncodeQueryComponent(value));
+				first = false;
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String addPageInfo(String url, PageInfo pageInfo)
+	{
+		if (pageInfo == null)
+		{
+			return url;
+		}
+		else
+		{
+			// Insert the page info at the and of the path and before the querystring.
+			if (url.indexOf('?') == -1)
+			{
+				return url + getBeginSeparator() + pageInfo.toString() + getEndSeparator();
+			}
+			else
+			{
+				return Strings.firstPathComponent(url, '?') + getBeginSeparator() +
+					pageInfo.toString() + getEndSeparator() + '?' +
+					Strings.afterFirstPathComponent(url, '?');
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected ValueMap decodeParameters(String urlFragment, Map<String, ?> urlParameters)
+	{
+		PageParameters params = new PageParameters();
+		// Add all url parameters
+		params.putAll(urlParameters);
+		String urlPath = urlFragment;
+		if (urlPath.startsWith("/"))
+		{
+			urlPath = urlPath.substring(1);
+		}
+
+		if (urlPath.length() > 0)
+		{
+			String[] pathParts = urlPath.split("/");
+			if (pathParts.length > parameterNames.length)
+			{
+				// Some known causes of this situation:
+				// - user edits the URL manually
+				// - a javascript requests resources relative to the current page instead of to the
+				// web context
+				String msg = String.format(
+					"Found more URL path parts then expected, these will be ignored. Url: '%s', mountpath: '%s', urlPath: '%s', expected %d parameters was %d",
+					getRequestUrl(), getMountPath(), urlPath, parameterNames.length,
+					pathParts.length);
+				if (ignoreUndeclaredParameters)
+				{
+					logger.info(msg);
+				}
+				else
+				{
+					throw new IllegalArgumentException(msg);
+				}
+			}
+
+			int actualParameterCount = Math.min(pathParts.length, parameterNames.length);
+			for (int i = 0; i < actualParameterCount; i++)
+			{
+				params.put(parameterNames[i], urlDecodePathComponent(pathParts[i]));
+			}
+		}
+
+		return params;
+	}
+
+	private String getRequestUrl()
+	{
+		HttpServletRequest request = ((WebRequest)RequestCycle.get().getRequest()).getHttpServletRequest();
+		return request.getRequestURL().toString();
+	}
 }
\ No newline at end of file