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();
+ }
+ }
+}