You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2010/09/09 18:08:24 UTC

svn commit: r995480 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/request/mapper/ResourceMapper.java test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java

Author: pete
Date: Thu Sep  9 16:08:24 2010
New Revision: 995480

URL: http://svn.apache.org/viewvc?rev=995480&view=rev
Log:
WICKET-2963: added ResourceMapper to bind resources to a custom mount path

Added:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java?rev=995480&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java Thu Sep  9 16:08:24 2010
@@ -0,0 +1,120 @@
+package org.apache.wicket.request.mapper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+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.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * resource mapper for resources.
+ * <ul>
+ * <li>maps indexed parameters to path segments</li>
+ * <li>maps named parameters to query string arguments</li>
+ * </ul>
+ * <p/>
+ * example url: <code>/articles/images/[indexed-param-0]/[indexed-param-1]?[named_param1=value1&named_param2=value2</code>
+ *
+ * @author Peter Ertl
+ */
+public class ResourceMapper extends AbstractMapper implements IRequestMapper
+{
+	private final String[] mountSegments;
+	private final ResourceReference resourceReference;
+
+	public ResourceMapper(String path, ResourceReference resourceReference)
+	{
+		Args.notEmpty(path, "path");
+		Args.notNull(resourceReference, "resourceReference");
+		this.resourceReference = resourceReference;
+		this.mountSegments = getMountSegments(path);
+	}
+
+	/**
+	 * @see org.apache.wicket.request.IRequestMapper#mapRequest(org.apache.wicket.request.Request)
+	 */
+	public IRequestHandler mapRequest(final Request request)
+	{
+		Url url = request.getUrl();
+		Iterator<String> segments = url.getSegments().iterator();
+
+		// see if url matches the path we are mounted at
+		for (String mountSegment : mountSegments)
+		{
+			if (segments.hasNext() == false)
+				return null; // given url is too short
+
+			if (mountSegment.equals(segments.next()) == false)
+				return null; // url does not fully match
+		}
+
+		// now extract the page parameters from the request url
+
+		PageParameters parameters = new PageParameters();
+
+		// extract indexed parameters
+		int index = 0;
+		while (segments.hasNext())
+			parameters.set(index++, segments.next());
+
+		// extract named parameters
+		for (Url.QueryParameter queryParameter : url.getQueryParameters())
+			parameters.add(queryParameter.getName(), queryParameter.getValue());
+
+		return new ResourceReferenceRequestHandler(resourceReference, parameters);
+	}
+
+	/**
+	 * @see org.apache.wicket.request.IRequestMapper#getCompatibilityScore(org.apache.wicket.request.Request)
+	 */
+	public int getCompatibilityScore(Request request)
+	{
+		return 0; // pages always have priority over resources
+	}
+
+	/**
+	 * @see org.apache.wicket.request.IRequestMapper#mapHandler(org.apache.wicket.request.IRequestHandler)
+	 */
+	public Url mapHandler(IRequestHandler requestHandler)
+	{
+		if ((requestHandler instanceof ResourceReferenceRequestHandler) == false)
+			return null;
+
+		ResourceReferenceRequestHandler handler = (ResourceReferenceRequestHandler)requestHandler;
+
+		// see if request handler addresses the resource we serve
+		if (resourceReference.getResource().equals(handler.getResource()) == false)
+			return null;
+
+		// create path to resource
+		List<String> path = new ArrayList<String>();
+
+		// add mount segments
+		path.addAll(Arrays.asList(mountSegments));
+
+		// next we add the page parameters to the resulting path
+		PageParameters parameters = handler.getPageParameters();
+
+		// append indexed parameters as path segments
+		for (int index = 0; index < parameters.getIndexedCount(); index++)
+			path.add(parameters.get(index).toString());
+
+		// append named parameters as query strings
+		List<PageParameters.NamedPair> namedParameters = parameters.getAllNamed();
+		List<Url.QueryParameter> queryParams = new ArrayList<Url.QueryParameter>(namedParameters.size());
+
+		for (PageParameters.NamedPair namedParameter : namedParameters)
+			queryParams.add(new Url.QueryParameter(namedParameter.getKey(), namedParameter.getValue()));
+
+		// create and return url
+		return new Url(path, queryParams);
+	}
+}

Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java?rev=995480&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/ResourceMapperTest.java Thu Sep  9 16:08:24 2010
@@ -0,0 +1,152 @@
+package org.apache.wicket.request.mapper;
+
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.wicket.WicketTestCase;
+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.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.SharedResourceReference;
+import org.apache.wicket.util.string.StringValue;
+import org.junit.Test;
+
+public class ResourceMapperTest extends WicketTestCase
+{
+	private static final Charset CHARSET = Charset.forName("UTF-8");
+	private static final String SHARED_NAME = "test-resource";
+
+	private IRequestMapper mapper;
+	private TestResource resource;
+
+	@Override
+	protected void setUp() throws Exception
+	{
+		super.setUp();
+
+		resource = new TestResource();
+		tester.getApplication().getSharedResources().add(SHARED_NAME, resource);
+		ResourceReference resourceReference = new SharedResourceReference(SHARED_NAME);
+		mapper = new ResourceMapper("/test/resource", resourceReference);
+		tester.getApplication().getRootRequestMapperAsCompound().add(mapper);
+	}
+
+	private Request createRequest(final String url)
+	{
+		return new Request()
+		{
+			@Override
+			public Url getUrl()
+			{
+				return Url.parse(url, CHARSET);
+			}
+
+			@Override
+			public Locale getLocale()
+			{
+				return null;
+			}
+
+			@Override
+			public Charset getCharset()
+			{
+				return CHARSET;
+			}
+		};
+	}
+
+	@Test
+	public void testInvalidPathIsEmpty()
+	{
+		IRequestHandler requestHandler = mapper.mapRequest(createRequest(""));
+		assertNull(requestHandler);
+	}
+
+	@Test
+	public void testInvalidPathIsMismatch()
+	{
+		IRequestHandler requestHandler = mapper.mapRequest(createRequest("test/resourcex"));
+		assertNull(requestHandler);
+	}
+
+	@Test
+	public void testInvalidPathIsTooShort()
+	{
+		IRequestHandler requestHandler = mapper.mapRequest(createRequest("test"));
+		assertNull(requestHandler);
+	}
+
+	@Test
+	public void testValidPathWithParams()
+	{
+		Request request = createRequest("test/resource/1/fred");
+		IRequestHandler requestHandler = mapper.mapRequest(request);
+		assertNotNull(requestHandler);
+		assertEquals(ResourceReferenceRequestHandler.class, requestHandler.getClass());
+		assertEquals(request.getUrl(), mapper.mapHandler(requestHandler));
+
+		tester.processRequest(requestHandler);
+		PageParameters params = resource.pageParameters;
+		assertNotNull(params);
+		assertEquals(0, params.getAllNamed().size());
+		assertEquals(2, params.getIndexedCount());
+
+		StringValue paramId = params.get(0);
+		assertNotNull(paramId);
+		assertEquals(1, paramId.toInt());
+
+		StringValue paramName = params.get(1);
+		assertNotNull(paramName);
+		assertEquals("fred", paramName.toString());
+	}
+
+	@Test
+	public void testValidPathWithParamsAndQueryPath()
+	{
+		Request request = createRequest("test/resource/1/fred?foo=bar&foo=baz&value=12");
+		IRequestHandler requestHandler = mapper.mapRequest(request);
+		assertNotNull(requestHandler);
+		assertEquals(ResourceReferenceRequestHandler.class, requestHandler.getClass());
+		assertEquals(request.getUrl(), mapper.mapHandler(requestHandler));
+
+		tester.processRequest(requestHandler);
+		PageParameters params = resource.pageParameters;
+		assertNotNull(params);
+		assertEquals(3, params.getAllNamed().size());
+		assertEquals(2, params.getIndexedCount());
+
+		StringValue paramId = params.get(0);
+		assertNotNull(paramId);
+		assertEquals(1, paramId.toInt());
+
+		StringValue paramName = params.get(1);
+		assertNotNull(paramName);
+		assertEquals("fred", paramName.toString());
+
+		List<StringValue> foo = params.getValues("foo");
+		assertNotNull(foo.size() == 2);
+		assertEquals("bar", foo.get(0).toString(""));
+		assertEquals("baz", foo.get(1).toString(""));
+
+		StringValue paramValue = params.get("value");
+		assertEquals(12, paramValue.toInt());
+	}
+
+	private static class TestResource implements IResource
+	{
+		private static final long serialVersionUID = -3130204487473856574L;
+
+		public PageParameters pageParameters;
+
+		public void respond(Attributes attributes)
+		{
+			this.pageParameters = attributes.getParameters();
+		}
+	}
+}