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