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/03/26 10:12:01 UTC

[2/2] git commit: WICKET-4466 Use an external host for the static javascript files (specially JQuery)

WICKET-4466 Use an external host for the static javascript files (specially JQuery)

Introduce ExternalUrlResourceReference that can be used to render Urls which are not part of the application.


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

Branch: refs/heads/master
Commit: 1071b2d0c17bbe92b796db8535768975822d353f
Parents: fb56d53
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Mar 26 10:08:39 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Mar 26 10:08:39 2012 +0200

----------------------------------------------------------------------
 .../mapper/BasicResourceReferenceMapper.java       |    7 ++
 .../resource/ExternalUrlResourceReference.java     |   78 +++++++++++++++
 .../wicket/request/cycle/UrlRendererTest.java      |   16 +++
 .../resource/ExternalUrlResourceReferenceTest.java |   45 +++++++++
 .../org/apache/wicket/request/UrlRenderer.java     |    7 +-
 5 files changed, 151 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/1071b2d0/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 6c0317d..89c7a4c 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
@@ -25,6 +25,7 @@ import org.apache.wicket.request.Url;
 import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
 import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ExternalUrlResourceReference;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.MetaInfStaticResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -176,6 +177,12 @@ class BasicResourceReferenceMapper extends AbstractResourceReferenceMapper
 				}
 				// otherwise it has to be served by the standard wicket way
 			}
+			else if (reference instanceof ExternalUrlResourceReference)
+			{
+				ExternalUrlResourceReference externalUrlReference = (ExternalUrlResourceReference) reference;
+				url = externalUrlReference.getUrl();
+				return url;
+			}
 
 			url = new Url();
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/1071b2d0/wicket-core/src/main/java/org/apache/wicket/request/resource/ExternalUrlResourceReference.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/ExternalUrlResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/ExternalUrlResourceReference.java
new file mode 100644
index 0000000..0cdf5b4
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/ExternalUrlResourceReference.java
@@ -0,0 +1,78 @@
+/*
+ * 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.resource;
+
+import org.apache.wicket.request.Url;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A ResourceReference that can be used to render a Url to a resource out of the
+ * current application, for example to a resource residing in a CDN (Content Delivering Network).
+ *
+ * @since 6.0
+ */
+public class ExternalUrlResourceReference extends ResourceReference
+{
+	/**
+	 * The url to the resource.
+	 */
+	private final Url externalUrl;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param externalUrl
+	 *      the url of the external resource
+	 */
+	public ExternalUrlResourceReference(final Url externalUrl)
+	{
+		super(asName(externalUrl));
+
+		if (externalUrl.isAbsolute() == false)
+		{
+			throw new IllegalArgumentException(ExternalUrlResourceReference.class.getSimpleName() +
+					" can be used only with absolute urls.");
+		}
+
+		this.externalUrl = externalUrl;
+	}
+
+	private static String asName(Url externalUrl)
+	{
+		Args.notNull(externalUrl, "externalUrl");
+		return externalUrl.toString();
+	}
+
+	/**
+	 * @return the url of the external resource
+	 */
+	public final Url getUrl()
+	{
+		return externalUrl;
+	}
+
+	/**
+	 * @return {@code null} because this ResourceReference wont use an IResource to deliver
+	 *  the content of the external resource. The browser will make a direct request to the
+	 *  external url.
+	 */
+	@Override
+	public IResource getResource()
+	{
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/1071b2d0/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 634f647..f958c5f 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
@@ -172,4 +172,20 @@ public class UrlRendererTest extends Assert
 		UrlRenderer r1 = new UrlRenderer(new MockWebRequest(Url.parse("foo/bar")));
 		assertEquals("../", r1.renderUrl(Url.parse("")));
 	}
+
+	/**
+	 * Verify that absolute urls are rendered as is, ignoring
+	 * the current client url and base url completely.
+	 *
+	 * https://issues.apache.org/jira/browse/WICKET-4466
+	 */
+	@Test
+	public void renderAbsoluteUrl()
+	{
+		String absoluteUrl = "http://www.example.com/some/path.ext";
+		Url url = Url.parse(absoluteUrl);
+		UrlRenderer renderer = new UrlRenderer(new MockWebRequest(Url.parse("foo/bar")));
+		String renderedUrl = renderer.renderUrl(url);
+		assertEquals(absoluteUrl, renderedUrl);
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/1071b2d0/wicket-core/src/test/java/org/apache/wicket/request/resource/ExternalUrlResourceReferenceTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ExternalUrlResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/request/resource/ExternalUrlResourceReferenceTest.java
new file mode 100644
index 0000000..34ce1e7
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/request/resource/ExternalUrlResourceReferenceTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.resource;
+
+import org.apache.wicket.request.Url;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @since 6.0
+ */
+public class ExternalUrlResourceReferenceTest extends Assert
+{
+	@Test(expected = IllegalArgumentException.class)
+	public void onlyAbsoluteUrlsAllowed()
+	{
+		Url url = Url.parse("some/relative/url");
+
+		// this should throw IllegalArgumentException because the Url is not absolute
+		new ExternalUrlResourceReference(url);
+	}
+
+	@Test
+	public void normalBehavior()
+	{
+		Url url = Url.parse("http://www.example.com/some/path.ext");
+		ExternalUrlResourceReference reference = new ExternalUrlResourceReference(url);
+		assertEquals(url, reference.getUrl());
+		assertNull(reference.getResource());
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/1071b2d0/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 05111f4..e7049f1 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
@@ -126,8 +126,11 @@ public class UrlRenderer
 			render.append(port);
 		}
 
-		render.append(request.getContextPath());
-		render.append(request.getFilterPath());
+		if (url.isAbsolute() == false)
+		{
+			render.append(request.getContextPath());
+			render.append(request.getFilterPath());
+		}
 		return Strings.join("/", render.toString(), path);
 	}