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/07/27 15:49:29 UTC

git commit: WICKET-4676 Relax restrictions on url of ExternalUrlResourceReference and rename it to UrlResourceReference

Updated Branches:
  refs/heads/master 428f4bb03 -> 1b9801afe


WICKET-4676 Relax restrictions on url of ExternalUrlResourceReference and rename it to UrlResourceReference


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

Branch: refs/heads/master
Commit: 1b9801afe36196328c8bcee77aa3599c0877989d
Parents: 428f4bb
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Jul 27 16:49:20 2012 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Jul 27 16:49:20 2012 +0300

----------------------------------------------------------------------
 .../mapper/BasicResourceReferenceMapper.java       |    8 +-
 .../wicket/protocol/http/WebApplication.java       |    5 +-
 .../apache/wicket/request/cycle/RequestCycle.java  |    4 +-
 .../resource/ExternalUrlResourceReference.java     |   78 -----------
 .../request/resource/UrlResourceReference.java     |  100 +++++++++++++++
 .../resource/ExternalUrlResourceReferenceTest.java |   45 -------
 .../wicket/request/resource/ResouceBundleTest.java |    2 +-
 .../request/resource/UrlResourceReferenceTest.java |   98 ++++++++++++++
 8 files changed, 207 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/1b9801af/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 e7ecb4e..4098525 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
@@ -26,7 +26,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.UrlResourceReference;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.MetaInfStaticResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
@@ -185,10 +185,10 @@ class BasicResourceReferenceMapper extends AbstractResourceReferenceMapper
 				}
 				// otherwise it has to be served by the standard wicket way
 			}
-			else if (reference instanceof ExternalUrlResourceReference)
+			else if (reference instanceof UrlResourceReference)
 			{
-				ExternalUrlResourceReference externalUrlReference = (ExternalUrlResourceReference)reference;
-				url = externalUrlReference.getUrl();
+				UrlResourceReference urlReference = (UrlResourceReference)reference;
+				url = urlReference.getUrl();
 				return url;
 			}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/1b9801af/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
index 7a3892a..42ab5d1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
@@ -64,7 +64,6 @@ import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.mapper.mount.MountMapper;
 import org.apache.wicket.request.resource.CssResourceReference;
-import org.apache.wicket.request.resource.ExternalUrlResourceReference;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.resource.bundles.ResourceBundleReference;
@@ -389,7 +388,7 @@ public abstract class WebApplication extends Application
 	/**
 	 * Registers a replacement resource for the given javascript resource. This replacement can be
 	 * another {@link JavaScriptResourceReference} for a packaged resource, but it can also be an
-	 * {@link ExternalUrlResourceReference} to replace the resource by a resource hosted on a CDN.
+	 * {@link org.apache.wicket.request.resource.UrlResourceReference} to replace the resource by a resource hosted on a CDN.
 	 * Registering a replacement will cause the resource to replaced by the given resource
 	 * throughout the application: if {@code base} is added, {@code replacement} will be added
 	 * instead.
@@ -410,7 +409,7 @@ public abstract class WebApplication extends Application
 	/**
 	 * Registers a replacement resource for the given CSS resource. This replacement can be another
 	 * {@link CssResourceReference} for a packaged resource, but it can also be an
-	 * {@link ExternalUrlResourceReference} to replace the resource by a resource hosted on a CDN.
+	 * {@link org.apache.wicket.request.resource.UrlResourceReference} to replace the resource by a resource hosted on a CDN.
 	 * Registering a replacement will cause the resource to replaced by the given resource
 	 * throughout the application: if {@code base} is added, {@code replacement} will be added
 	 * instead.

http://git-wip-us.apache.org/repos/asf/wicket/blob/1b9801af/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
index 9cefde7..1f57fe1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
@@ -505,7 +505,7 @@ public class RequestCycle implements IRequestCycle, IEventSink
 			{
 				ResourceReferenceRequestHandler rrrh = (ResourceReferenceRequestHandler)handler;
 				IResource resource = rrrh.getResource();
-				if (!(resource instanceof IStaticCacheableResource) || shouldEncodeStaticResource)
+				if (resource != null && !(resource instanceof IStaticCacheableResource) || shouldEncodeStaticResource)
 				{
 					renderedUrl = getOriginalResponse().encodeURL(renderedUrl);
 				}
@@ -514,7 +514,7 @@ public class RequestCycle implements IRequestCycle, IEventSink
 			{
 				ResourceRequestHandler rrh = (ResourceRequestHandler)handler;
 				IResource resource = rrh.getResource();
-				if (!(resource instanceof IStaticCacheableResource) || shouldEncodeStaticResource)
+				if (resource != null && !(resource instanceof IStaticCacheableResource) || shouldEncodeStaticResource)
 				{
 					renderedUrl = getOriginalResponse().encodeURL(renderedUrl);
 				}

http://git-wip-us.apache.org/repos/asf/wicket/blob/1b9801af/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
deleted file mode 100644
index 0cdf5b4..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/ExternalUrlResourceReference.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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/1b9801af/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
new file mode 100644
index 0000000..8a5592a
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/UrlResourceReference.java
@@ -0,0 +1,100 @@
+/*
+ * 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.core.util.string.UrlUtils;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A ResourceReference that can be used to point to a resource by using an Url.
+ * For example to a resource residing in a CDN (Content Delivering Network) or
+ * context relative one.
+ *
+ * @since 6.0
+ */
+public class UrlResourceReference extends ResourceReference
+{
+	/**
+	 * The url to the resource.
+	 */
+	private final Url url;
+
+	private boolean contextRelative = false;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param url
+	 *      the url of the external resource
+	 */
+	public UrlResourceReference(final Url url)
+	{
+		super(asName(url));
+
+		this.url = url;
+	}
+
+	private static String asName(Url externalUrl)
+	{
+		Args.notNull(externalUrl, "url");
+		return externalUrl.toString();
+	}
+
+	/**
+	 * @return the url of the external resource
+	 */
+	public final Url getUrl()
+	{
+		Url _url = url;
+
+		if (contextRelative)
+		{
+			String contextRelative = UrlUtils.rewriteToContextRelative(url.toString(), RequestCycle.get());
+			_url = Url.parse(contextRelative, url.getCharset());
+		}
+
+		return _url;
+	}
+
+	/**
+	 * @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 final IResource getResource()
+	{
+		return null;
+	}
+
+	public UrlResourceReference setContextRelative(final boolean contextRelative)
+	{
+		if (contextRelative && url.isAbsolute())
+		{
+			throw new IllegalStateException("An absolute url '{}' cannot be rendered as context relative");
+		}
+		this.contextRelative = contextRelative;
+		return this;
+	}
+
+	public boolean isContextRelative()
+	{
+		return contextRelative;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/1b9801af/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
deleted file mode 100644
index 34ce1e7..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ExternalUrlResourceReferenceTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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/1b9801af/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 3d561c2..e40de1a 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
@@ -74,7 +74,7 @@ public class ResouceBundleTest extends WicketTestCase
 	public void externalBundle() throws Exception
 	{
 		ResourceBundleReference bundle = new ResourceBundleReference(
-			new ExternalUrlResourceReference(
+			new UrlResourceReference(
 				Url.parse("http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js")));
 		bundle.addProvidedResources(
 			JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(

http://git-wip-us.apache.org/repos/asf/wicket/blob/1b9801af/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
new file mode 100644
index 0000000..fcb884c
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.MarkupContainer;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.junit.Test;
+
+/**
+ * @since 6.0
+ */
+public class UrlResourceReferenceTest extends WicketTestCase
+{
+	public void relativeUrl()
+	{
+		Url url = Url.parse("some/relative/url");
+		UrlResourceReference reference = new UrlResourceReference(url);
+		assertEquals(url, reference.getUrl());
+
+		CharSequence _url = tester.getRequestCycle().urlFor(reference, null);
+		assertEquals(url.toString(), _url);
+		assertNull(reference.getResource());
+	}
+
+	@Test
+	public void absoluteUrl()
+	{
+		Url url = Url.parse("http://www.example.com/some/path.ext");
+		UrlResourceReference reference = new UrlResourceReference(url);
+		assertEquals(url, reference.getUrl());
+		assertNull(reference.getResource());
+
+		CharSequence _url = tester.getRequestCycle().urlFor(reference, null);
+		assertEquals(url.toString(Url.StringMode.FULL), _url);
+		assertNull(reference.getResource());
+	}
+
+	@Test(expected = IllegalStateException.class)
+	public void cannotMakeAnAbsoluteUrlContextRelative()
+	{
+		Url url = Url.parse("http://www.example.com/some/path.ext");
+		UrlResourceReference reference = new UrlResourceReference(url);
+		reference.setContextRelative(true);
+	}
+
+	@Test
+	public void contextRelativeUrl()
+	{
+		tester.getApplication().mountPage("/some/mount/path", TestPage.class);
+		tester.startPage(new TestPage());
+
+		tester.assertContains("<script type=\"text/javascript\" src=\"../../::/::/some/relative/url\"></script>");
+	}
+
+	/**
+	 * A test page for #contextRelativeUrl()
+	 */
+	private static class TestPage extends WebPage implements IMarkupResourceStreamProvider
+	{
+		@Override
+		public void renderHead(IHeaderResponse response)
+		{
+			super.renderHead(response);
+
+			Url url = Url.parse("some/relative/url");
+			UrlResourceReference reference = new UrlResourceReference(url);
+			reference.setContextRelative(true);
+			response.render(JavaScriptHeaderItem.forReference(reference));
+		}
+
+		@Override
+		public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass)
+		{
+			return new StringResourceStream("<html><head></head></html>");
+		}
+	}
+}