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 2013/02/27 10:44:24 UTC

[2/2] git commit: WICKET-4907 UrlResourceReference generates broken relative URLs WICKET-4942 Double slash '//' in starting url makes Url.parse output a relative Url WICKET-4903 relativeUrl's begins with ./

Updated Branches:
  refs/heads/master 8d774aead -> 25294f4d9


WICKET-4907 UrlResourceReference generates broken relative URLs
WICKET-4942 Double slash '//' in starting url makes Url.parse output a relative Url
WICKET-4903 relativeUrl's begins with ./


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

Branch: refs/heads/master
Commit: 25294f4d9e48497b69c586da2cae3b4ba532d751
Parents: 01f32fa
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Feb 27 11:42:30 2013 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Feb 27 11:42:30 2013 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/wicket/SystemMapper.java  |    1 +
 .../apache/wicket/UrlResourceReferenceMapper.java  |   71 +++++++++++++++
 .../mapper/BasicResourceReferenceMapper.java       |    9 +--
 .../request/resource/UrlResourceReference.java     |   33 +++++++-
 .../markup/html/internal/InlineEnclosureTest.java  |    7 ++
 .../wicket/request/cycle/UrlRendererTest.java      |    1 +
 .../wicket/request/resource/ResouceBundleTest.java |    2 +-
 .../request/resource/UrlResourceReferenceTest.java |    3 +-
 .../org/apache/wicket/request/IUrlRenderer.java    |   46 ++++++++++
 .../org/apache/wicket/request/UrlRenderer.java     |   12 +++
 10 files changed, 173 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java b/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
index aaba006..c695581 100644
--- a/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
@@ -50,6 +50,7 @@ public class SystemMapper extends CompoundRequestMapper
 		add(new HomePageMapper(new HomePageProvider(application)));
 		add(new ResourceReferenceMapper(new PageParametersEncoder(),
 			new ParentFolderPlaceholderProvider(application), getResourceCachingStrategy()));
+		add(new UrlResourceReferenceMapper());
 		add(RestartResponseAtInterceptPageException.MAPPER);
 		add(new BufferedResponseMapper());
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/main/java/org/apache/wicket/UrlResourceReferenceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/UrlResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/UrlResourceReferenceMapper.java
new file mode 100644
index 0000000..d25ff88
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/UrlResourceReferenceMapper.java
@@ -0,0 +1,71 @@
+/*
+ * 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;
+
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.IRequestMapper;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.UrlResourceReference;
+import org.apache.wicket.resource.bundles.ResourceBundleReference;
+
+/**
+ * A request mapper that is used to create Url out of UrlResourceReference.
+ * UrlResourceReference works with {@link org.apache.wicket.request.resource.UrlResourceReference.CalculatedUrl} and
+ * thus this mapper should not use {@link org.apache.wicket.SystemMapper.ParentFolderPlaceholderProvider}
+ */
+public class UrlResourceReferenceMapper implements IRequestMapper
+{
+	@Override
+	public Url mapHandler(IRequestHandler requestHandler)
+	{
+		Url url = null;
+		if (requestHandler instanceof ResourceReferenceRequestHandler)
+		{
+			ResourceReferenceRequestHandler resourceReferenceRequestHandler = (ResourceReferenceRequestHandler) requestHandler;
+			ResourceReference resourceReference = resourceReferenceRequestHandler.getResourceReference();
+
+			while (resourceReference instanceof ResourceBundleReference)
+			{
+				// unwrap the bundle to render the url for the actual reference
+				resourceReference = ((ResourceBundleReference)resourceReference).getBundleReference();
+			}
+
+			if (resourceReference instanceof UrlResourceReference)
+			{
+				UrlResourceReference urlResourceReference = (UrlResourceReference) resourceReference;
+				url = urlResourceReference.getUrl();
+			}
+		}
+		return url;
+	}
+
+	@Override
+	public IRequestHandler mapRequest(Request request)
+	{
+		return null;
+	}
+
+	@Override
+	public int getCompatibilityScore(Request request)
+	{
+		return Integer.MIN_VALUE;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
index 02bf367..665dafe 100755
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
@@ -30,7 +30,6 @@ import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.MetaInfStaticResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.request.resource.ResourceReferenceRegistry;
-import org.apache.wicket.request.resource.UrlResourceReference;
 import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
 import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
 import org.apache.wicket.request.resource.caching.ResourceUrl;
@@ -169,7 +168,7 @@ public class BasicResourceReferenceMapper extends AbstractResourceReferenceMappe
 
 			Url url;
 
-			if (reference instanceof ResourceBundleReference)
+			while (reference instanceof ResourceBundleReference)
 			{
 				// unwrap the bundle to render the url for the actual reference
 				reference = ((ResourceBundleReference)reference).getBundleReference();
@@ -185,12 +184,6 @@ public class BasicResourceReferenceMapper extends AbstractResourceReferenceMappe
 				}
 				// otherwise it has to be served by the standard wicket way
 			}
-			else if (reference instanceof UrlResourceReference)
-			{
-				UrlResourceReference urlReference = (UrlResourceReference)reference;
-				url = urlReference.getUrl();
-				return url;
-			}
 
 			if (reference.canBeRegistered())
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/main/java/org/apache/wicket/request/resource/UrlResourceReference.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/UrlResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/UrlResourceReference.java
index 4c16c8b..98e76c9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/UrlResourceReference.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/UrlResourceReference.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.request.resource;
 
+import org.apache.wicket.request.IUrlRenderer;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.UrlUtils;
 import org.apache.wicket.request.cycle.RequestCycle;
@@ -31,6 +32,30 @@ import org.apache.wicket.util.lang.Args;
 public class UrlResourceReference extends ResourceReference
 {
 	/**
+	 * An Url that knows how to render itself, so it doesn't need re-calculating in UrlRenderer.
+	 * It should be rendered as is.
+	 */
+	private static class CalculatedUrl extends Url implements IUrlRenderer
+	{
+		private CalculatedUrl(Url original)
+		{
+			super(original);
+		}
+
+		@Override
+		public String renderFullUrl(Url url, Url baseUrl)
+		{
+			return url.toString(StringMode.FULL);
+		}
+
+		@Override
+		public String renderRelativeUrl(Url url, Url baseUrl)
+		{
+			return url.toString();
+		}
+	}
+
+	/**
 	 * The url to the resource.
 	 */
 	private final Url url;
@@ -61,12 +86,16 @@ public class UrlResourceReference extends ResourceReference
 	 */
 	public final Url getUrl()
 	{
-		Url _url = url;
+		CalculatedUrl _url;
 
 		if (contextRelative)
 		{
 			String contextRelative = UrlUtils.rewriteToContextRelative(url.toString(), RequestCycle.get());
-			_url = Url.parse(contextRelative, url.getCharset());
+			_url = new CalculatedUrl(Url.parse(contextRelative, url.getCharset()));
+		}
+		else
+		{
+			_url = new CalculatedUrl(url);
 		}
 
 		return _url;

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/InlineEnclosureTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/InlineEnclosureTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/InlineEnclosureTest.java
index f085672..ed29a70 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/InlineEnclosureTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/InlineEnclosureTest.java
@@ -56,6 +56,13 @@ public class InlineEnclosureTest extends WicketTestCase
 		executeTest(InlineEnclosurePanelPage.class, "InlineEnclosurePanelPageExpectedResult.html");
 	}
 
+	@Test
+	public void inlineEnclosurePageDifferentNamespace() throws Exception
+	{
+		executeTest(InlineEnclosureDifferentNamespacePage.class,
+		"InlineEnclosureDifferentNamespaceExpectedResult.html");
+	}
+
 	/**
 	 * https://issues.apache.org/jira/browse/WICKET-4520
 	 *

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java b/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
index bbb8b26..a11e84a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
@@ -466,4 +466,5 @@ public class UrlRendererTest extends Assert
 
 		assertEquals("../../../../a/b;jsessionid=123456", encodedRelativeUrl);
 	}
+
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java b/wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java
index ea60618..cb5173c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java
@@ -26,7 +26,7 @@ import org.apache.wicket.resource.bundles.ResourceBundleReference;
 import org.junit.Test;
 
 /**
- * Testcases for resource bundles
+ * Test cases for resource bundles
  * 
  * @author papegaaij
  */

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java
index fcb884c..62fb31a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java
@@ -32,6 +32,7 @@ import org.junit.Test;
  */
 public class UrlResourceReferenceTest extends WicketTestCase
 {
+	@Test
 	public void relativeUrl()
 	{
 		Url url = Url.parse("some/relative/url");
@@ -70,7 +71,7 @@ public class UrlResourceReferenceTest extends WicketTestCase
 		tester.getApplication().mountPage("/some/mount/path", TestPage.class);
 		tester.startPage(new TestPage());
 
-		tester.assertContains("<script type=\"text/javascript\" src=\"../../::/::/some/relative/url\"></script>");
+		tester.assertContains("<script type=\"text/javascript\" src=\"../../some/relative/url\"></script>");
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-request/src/main/java/org/apache/wicket/request/IUrlRenderer.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/IUrlRenderer.java b/wicket-request/src/main/java/org/apache/wicket/request/IUrlRenderer.java
new file mode 100644
index 0000000..6011772
--- /dev/null
+++ b/wicket-request/src/main/java/org/apache/wicket/request/IUrlRenderer.java
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+/**
+ * An interface that a Url can implement if it knows how to
+ * render itself as full url or relative to a base url
+ */
+public interface IUrlRenderer
+{
+	/**
+	 * Renders the passed url as full/absolute.
+	 *
+	 * @param url
+	 *      the url to render as full
+	 * @param baseUrl
+	 *      the url of the currently rendered page
+	 * @return The full url.
+	 */
+	String renderFullUrl(final Url url, Url baseUrl);
+
+	/**
+	 * Renders the passed url as relative to a base url.
+	 *
+	 * @param url
+	 *      the url to render as relative
+	 * @param baseUrl
+	 *      the url of the currently rendered page
+	 * @return The relative url.
+	 */
+	String renderRelativeUrl(final Url url, Url baseUrl);
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/25294f4d/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java b/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
index e092957..c4005cc 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
@@ -127,6 +127,12 @@ public class UrlRenderer
 	 */
 	public String renderFullUrl(final Url url)
 	{
+		if (url instanceof IUrlRenderer)
+		{
+			IUrlRenderer renderer = (IUrlRenderer) url;
+			return renderer.renderFullUrl(url, getBaseUrl());
+		}
+
 		final String protocol = resolveProtocol(url);
 		final String host = resolveHost(url);
 		final Integer port = resolvePort(url);
@@ -214,6 +220,12 @@ public class UrlRenderer
 	{
 		Args.notNull(url, "url");
 
+		if (url instanceof IUrlRenderer)
+		{
+			IUrlRenderer renderer = (IUrlRenderer) url;
+			return renderer.renderRelativeUrl(url, getBaseUrl());
+		}
+
 		List<String> baseUrlSegments = getBaseUrl().getSegments();
 		List<String> urlSegments = new ArrayList<String>(url.getSegments());