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 <[email protected]> Authored: Mon Mar 26 10:08:39 2012 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> 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); }
