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 2016/03/08 23:36:48 UTC
[07/52] [abbrv] wicket git commit: WICKET-6094 Find adequate
ResourceReference with mount parameters
WICKET-6094 Find adequate ResourceReference with mount parameters
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/d0b83efb
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/d0b83efb
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/d0b83efb
Branch: refs/heads/lambdas
Commit: d0b83efb22997664f797ff5f1fcb7c29e852d952
Parents: ed7c997
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Feb 18 22:52:06 2016 +0100
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Thu Feb 18 22:53:05 2016 +0100
----------------------------------------------------------------------
.../mapper/AbstractBookmarkableMapper.java | 3 -
.../core/request/mapper/ResourceMapper.java | 32 +++-
.../MoreSpecificResourceMountPathTest.java | 173 +++++++++++++++++++
.../wicket/request/mapper/AbstractMapper.java | 16 +-
4 files changed, 211 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/d0b83efb/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
index 420b808..4d34e8c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
@@ -201,9 +201,6 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
*/
protected abstract boolean pageMustHaveBeenCreatedBookmarkable();
- /**
- * @see IRequestMapper#getCompatibilityScore(Request)
- */
@Override
public int getCompatibilityScore(Request request)
{
http://git-wip-us.apache.org/repos/asf/wicket/blob/d0b83efb/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
index c438319..d89543e 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
@@ -27,7 +27,6 @@ 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.http.flow.AbortWithHttpErrorCodeException;
-import org.apache.wicket.request.mapper.AbstractMapper;
import org.apache.wicket.request.mapper.parameter.INamedParameters;
import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -71,7 +70,7 @@ import org.apache.wicket.util.string.Strings;
*
* @author Peter Ertl
*/
-public class ResourceMapper extends AbstractMapper implements IRequestMapper
+public class ResourceMapper extends AbstractBookmarkableMapper
{
// encode page parameters into url + decode page parameters from url
private final IPageParametersEncoder parametersEncoder;
@@ -111,9 +110,8 @@ public class ResourceMapper extends AbstractMapper implements IRequestMapper
public ResourceMapper(String path, ResourceReference resourceReference,
IPageParametersEncoder encoder)
{
- Args.notEmpty(path, "path");
+ super(path, encoder);
Args.notNull(resourceReference, "resourceReference");
- Args.notNull(encoder, "encoder");
this.resourceReference = resourceReference;
mountSegments = getMountSegments(path);
@@ -157,9 +155,33 @@ public class ResourceMapper extends AbstractMapper implements IRequestMapper
}
@Override
+ protected final UrlInfo parseRequest(final Request request) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected final Url buildUrl(final UrlInfo info) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected final boolean pageMustHaveBeenCreatedBookmarkable() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public int getCompatibilityScore(Request request)
{
- return 0; // pages always have priority over resources
+ int score = super.getCompatibilityScore(request);
+ if (score > 0)
+ {
+ score--; // pages always have priority over resources
+ }
+ else
+ {
+ score = -1;
+ }
+ return score;
}
@Override
http://git-wip-us.apache.org/repos/asf/wicket/blob/d0b83efb/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MoreSpecificResourceMountPathTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MoreSpecificResourceMountPathTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MoreSpecificResourceMountPathTest.java
new file mode 100644
index 0000000..9d5f582
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MoreSpecificResourceMountPathTest.java
@@ -0,0 +1,173 @@
+/*
+ * 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.core.request.mapper;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.resource.ByteArrayResource;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.util.string.StringValue;
+import org.apache.wicket.util.tester.DummyHomePage;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.net.URL;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+
+/**
+ * https://issues.apache.org/jira/browse/WICKET-6094
+ */
+public class MoreSpecificResourceMountPathTest
+{
+ @Test
+ public void can_use_resource_mounted_without_parameter()
+ {
+ WicketTester browser = new WicketTester(new WicketApplication());
+ browser.executeUrl(WicketApplication.urlFor("howdy"));
+ Assert.assertThat(browser.getLastResponseAsString(), is(equalTo("howdy")));
+ }
+
+ @Test
+ public void can_use_resource_mounted_with_parameter()
+ {
+ WicketTester browser = new WicketTester(new WicketApplication());
+ browser.executeUrl(WicketApplication.urlFor(1L));
+ Assert.assertThat(browser.getLastResponseAsString(), is(equalTo("1")));
+ }
+
+ public static class WicketApplication extends WebApplication
+ {
+ private static final String OWNER_BY_ID_LOADER = "owner-by-id-loader";
+ private static final String OWNERS_LISTER = "owners-lister";
+ public static final String PARAM_ID = "id";
+ public static final String PARAM_NAME = "name";
+
+ @Override
+ public Class<? extends WebPage> getHomePage()
+ {
+ return DummyHomePage.class;
+ }
+
+ @Override
+ public void init()
+ {
+ super.init();
+
+ String path = "/ajax/owners"; // shared by both references
+
+ mountResource(path, new ResourceReference(OWNERS_LISTER)
+ {
+ @Override
+ public IResource getResource()
+ {
+ return new DummyResource(PARAM_NAME);
+ }
+ });
+
+ mountResource(path + "/${" + PARAM_ID + "}", new ResourceReference(OWNER_BY_ID_LOADER)
+ {
+ @Override
+ public IResource getResource()
+ {
+ return new DummyResource(PARAM_ID);
+ }
+ });
+ }
+
+ public static String urlFor(String name)
+ {
+ return urlFor(name, PARAM_NAME, OWNERS_LISTER);
+ }
+
+ public static String urlFor(Long id)
+ {
+ return urlFor(id, PARAM_ID, OWNER_BY_ID_LOADER);
+ }
+
+ /** <Test-Helper>
+ * Generate an {@link URL} to access the mounted resource reference.
+ * @param value of dummy attribute used to have some testable response output.
+ * @param parameterName of dummy attribute
+ * @param resourceReferenceName used to mount instance
+ * @return {@link CharSequence} url for resource reference
+ */
+ private static String urlFor(Object value, String parameterName, String resourceReferenceName)
+ {
+ PageParameters parameters = new PageParameters();
+ if (value != null)
+ {
+ parameters.set(parameterName, value);
+ }
+ ResourceReference resourceReference = findResourceReference(resourceReferenceName);
+ String string = RequestCycle.get().urlFor(resourceReference, parameters).toString();
+ return string;
+ }
+
+ /** <Test-Helper>
+ * Find resource reference mounted in application.
+ * @param name of resource reference used to mount instance
+ * @return {@link ResourceReference} found
+ */
+ private static ResourceReference findResourceReference(String name)
+ {
+ return Application.get()
+ .getResourceReferenceRegistry()
+ .getResourceReference(
+ new ResourceReference.Key(
+ Application.class.getName(),
+ name,
+ null,
+ null,
+ null
+ ),
+ false,
+ false
+ );
+ }
+
+ /** <Test-Helper>
+ * This is only a dummy to be referenced. It is possible to
+ * exchange this by a mock or whatever.
+ *
+ * @author rene.dieckmann@menoto.de
+ */
+ private static class DummyResource extends ByteArrayResource
+ {
+ private final String parameterName;
+
+ public DummyResource(String parameterName)
+ {
+ super("application/text");
+ this.parameterName = parameterName;
+ }
+
+ @Override
+ protected byte[] getData(Attributes attributes)
+ {
+ StringValue value = attributes.getParameters().get(parameterName);
+ return value == null ? new byte[0] : value.toString().getBytes();
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/d0b83efb/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java b/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
index 5f5060b..a9f7143 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/mapper/AbstractMapper.java
@@ -86,8 +86,7 @@ public abstract class AbstractMapper implements IRequestMapper
}
/**
- * Returns true if the given url starts with specified segments. Segments that contain
- * placeholders are not compared.
+ * Returns true if the given url starts with specified segments.
*
* @param url
* @param segments
@@ -105,9 +104,16 @@ public abstract class AbstractMapper implements IRequestMapper
for (int i = 0; i < segments.length; ++i)
{
- if (!segments[i].equals(safeSegmentGetter(urlSegments, i , "")) &&
- (getPlaceholder(segments[i]) == null &&
- getOptionalPlaceholder(segments[i]) == null))
+ String segment = segments[i];
+ String urlSegment = safeSegmentGetter(urlSegments, i, null);
+ if (urlSegment == null && getOptionalPlaceholder(segment) == null)
+ {
+ // if the 'segment' has static value or is mandatory placeholder
+ return false;
+ }
+ else if (!segment.equals(urlSegment) &&
+ (getPlaceholder(segment) == null &&
+ getOptionalPlaceholder(segment) == null))
{
return false;
}