You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/10/29 15:32:50 UTC

[1/2] git commit: WICKET-4844 AbstractResourceReferenceMapper doesn't escape separators in style/variation names

Updated Branches:
  refs/heads/wicket-1.5.x a341422bc -> 7c5c8d103


WICKET-4844 AbstractResourceReferenceMapper doesn't escape separators in style/variation names


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/6419d8a4
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/6419d8a4
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/6419d8a4

Branch: refs/heads/wicket-1.5.x
Commit: 6419d8a45e9550c5c391f4191dba57931e1d7b45
Parents: a341422
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Oct 29 16:31:26 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Oct 29 16:32:37 2012 +0200

----------------------------------------------------------------------
 .../mapper/AbstractResourceReferenceMapper.java    |   54 +++++++++----
 .../AbstractResourceReferenceMapperOwnTest.java    |   66 +++++++++++++++
 2 files changed, 105 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/6419d8a4/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java
index ce4896c..fb8a0af 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java
@@ -19,7 +19,6 @@ package org.apache.wicket.request.mapper;
 import java.util.Locale;
 
 import org.apache.wicket.request.Url;
-import org.apache.wicket.request.Url.QueryParameter;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.string.Strings;
@@ -31,9 +30,35 @@ import org.apache.wicket.util.string.Strings;
  */
 public abstract class AbstractResourceReferenceMapper extends AbstractComponentMapper
 {
+	/**
+	 * Escapes any occurrences of <em>-</em> character in the style and variation
+	 * attributes with <em>~</em>. Any occurrence of <em>~</em> is encoded as <em>~~</em>.
+	 *
+	 * @param attribute
+	 *      the attribute to escape
+	 * @return the attribute with escaped separator character
+	 */
+	public static CharSequence escapeAttributesSeparator(String attribute)
+	{
+		CharSequence tmp = Strings.replaceAll(attribute, "~", "~~");
+		return Strings.replaceAll(tmp, "-", "~");
+	}
+
+	/**
+	 * Reverts the escaping applied by {@linkplain #escapeAttributesSeparator(String)} - unescapes
+	 * occurrences of <em>~</em> character in the style and variation attributes with <em>-</em>.
+	 *
+	 * @param attribute
+	 *      the attribute to unescape
+	 * @return the attribute with escaped separator character
+	 */
+	public static String unescapeAttributesSeparator(String attribute)
+	{
+		String tmp = attribute.replaceAll("(\\w)~(\\w)", "$1-$2");
+		return Strings.replaceAll(tmp, "~~", "~").toString();
+	}
 
-	protected static String encodeResourceReferenceAttributes(
-		ResourceReference.UrlAttributes attributes)
+	public static String encodeResourceReferenceAttributes(ResourceReference.UrlAttributes attributes)
 	{
 		if (attributes == null ||
 			(attributes.getLocale() == null && attributes.getStyle() == null && attributes.getVariation() == null))
@@ -42,16 +67,16 @@ public abstract class AbstractResourceReferenceMapper extends AbstractComponentM
 		}
 		else
 		{
-			StringBuilder res = new StringBuilder();
+			StringBuilder res = new StringBuilder(32);
 			if (attributes.getLocale() != null)
 			{
-				res.append(attributes.getLocale().toString());
+				res.append(attributes.getLocale());
 			}
 			boolean styleEmpty = Strings.isEmpty(attributes.getStyle());
 			if (!styleEmpty)
 			{
 				res.append('-');
-				res.append(attributes.getStyle());
+				res.append(escapeAttributesSeparator(attributes.getStyle()));
 			}
 			if (!Strings.isEmpty(attributes.getVariation()))
 			{
@@ -63,7 +88,7 @@ public abstract class AbstractResourceReferenceMapper extends AbstractComponentM
 				{
 					res.append('-');
 				}
-				res.append(attributes.getVariation());
+				res.append(escapeAttributesSeparator(attributes.getVariation()));
 			}
 			return res.toString();
 		}
@@ -81,25 +106,24 @@ public abstract class AbstractResourceReferenceMapper extends AbstractComponentM
 		}
 	}
 
-	protected static ResourceReference.UrlAttributes decodeResourceReferenceAttributes(
-		String attributes)
+	public static ResourceReference.UrlAttributes decodeResourceReferenceAttributes(String attributes)
 	{
 		Locale locale = null;
 		String style = null;
 		String variation = null;
 
-		if (!Strings.isEmpty(attributes))
+		if (Strings.isEmpty(attributes) == false)
 		{
-			String split[] = attributes.split("-", 3);
+			String split[] = Strings.split(attributes, '-');
 			locale = parseLocale(split[0]);
 			if (split.length == 2)
 			{
-				style = nonEmpty(split[1]);
+				style = nonEmpty(unescapeAttributesSeparator(split[1]));
 			}
 			else if (split.length == 3)
 			{
-				style = nonEmpty(split[1]);
-				variation = nonEmpty(split[2]);
+				style = nonEmpty(unescapeAttributesSeparator(split[1]));
+				variation = nonEmpty(unescapeAttributesSeparator(split[2]));
 			}
 		}
 		return new ResourceReference.UrlAttributes(locale, style, variation);
@@ -148,7 +172,7 @@ public abstract class AbstractResourceReferenceMapper extends AbstractComponentM
 
 		if (url.getQueryParameters().size() > 0)
 		{
-			QueryParameter param = url.getQueryParameters().get(0);
+			Url.QueryParameter param = url.getQueryParameters().get(0);
 			if (Strings.isEmpty(param.getValue()))
 			{
 				return decodeResourceReferenceAttributes(param.getName());

http://git-wip-us.apache.org/repos/asf/wicket/blob/6419d8a4/wicket-core/src/test/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapperOwnTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapperOwnTest.java b/wicket-core/src/test/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapperOwnTest.java
new file mode 100644
index 0000000..8e73a5d
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapperOwnTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.mapper;
+
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Url;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for AbstractResourceReferenceMapper's own methods
+ */
+public class AbstractResourceReferenceMapperOwnTest extends Assert
+{
+	@Test
+	public void testEscapeAttributesSeparator() throws Exception
+	{
+		AbstractResourceReferenceMapper mapper = new Mapper();
+		CharSequence escaped = mapper.escapeAttributesSeparator("my-style~is~~cool");
+		assertEquals("my~style~~is~~~~cool", escaped.toString());
+	}
+
+	@Test
+	public void testUnescapeAttributesSeparator() throws Exception
+	{
+		AbstractResourceReferenceMapper mapper = new Mapper();
+		CharSequence escaped = mapper.unescapeAttributesSeparator("my~style~~is~~~~cool");
+		assertEquals("my-style~is~~cool", escaped.toString());
+	}
+
+	/**
+	 * A non-abstract class used for the tests
+	 */
+	private static class Mapper extends AbstractResourceReferenceMapper
+	{
+		public IRequestHandler mapRequest(Request request)
+		{
+			return null;
+		}
+
+		public int getCompatibilityScore(Request request)
+		{
+			return 0;
+		}
+
+		public Url mapHandler(IRequestHandler requestHandler)
+		{
+			return null;
+		}
+	}
+}