/* * 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; import java.util.function.Supplier; import org.apache.wicket.core.request.handler.PageProvider; import org.apache.wicket.core.request.handler.RenderPageRequestHandler; import org.apache.wicket.markup.IMarkupResourceStreamProvider; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.request.IExceptionMapper; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.util.lang.Exceptions; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.StringResourceStream; import org.apache.wicket.util.tester.WicketTestCase; import org.junit.Ignore; /** */ @Ignore public class ExceptionMapperTest extends WicketTestCase { /** * Testing an custom exception mapper provider that return an wrapped exception mapper in order * to catch special exceptions. It is important to enable other frameworks to plug in the * application a custom response for their exceptions. * * @see <a href="https://issues.apache.org/jira/browse/WICKET-3256">WICKET-3256</a> */ public void exceptionMapper() { Application app = tester.getApplication(); WrapperProvider wrapper = new WrapperProvider(app.getExceptionMapperProvider()); // martin-g: WICKET-3806 IRequestCycleListener#onException() should be used by clients // app.setExceptionMapperProvider(wrapper); tester.setExposeExceptions(false); tester.startPage(TestPage.class); tester.clickLink(MockPageWithLink.LINK_ID); tester.assertRenderedPage(TestExceptionPage.class); } /** */ public static class WrapperProvider implements Supplier<IExceptionMapper> { private Supplier<IExceptionMapper> wrapped; WrapperExceptionMapper wrapperExceptionMapper; /** * @param wrapped * exception mapper provider */ public WrapperProvider(Supplier<IExceptionMapper> wrapped) { this.wrapped = wrapped; } @Override public IExceptionMapper get() { return wrapperExceptionMapper = new WrapperExceptionMapper(wrapped.get()); } } /** */ public static class WrapperExceptionMapper implements IExceptionMapper { private IExceptionMapper wrapped; /** * @param wrapped * IExceptionMapper */ public WrapperExceptionMapper(IExceptionMapper wrapped) { this.wrapped = wrapped; } @Override public IRequestHandler map(Exception e) { if (Exceptions.findCause(e, TestException.class) != null) { return new RenderPageRequestHandler(new PageProvider(TestExceptionPage.class)); } return wrapped.map(e); } } /** */ public static class TestException extends RuntimeException { private static final long serialVersionUID = 1L; } /** */ public static class TestExceptionPage extends WebPage implements IMarkupResourceStreamProvider { private static final long serialVersionUID = 1L; @Override public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) { return new StringResourceStream("<html><body></body></html>"); } } /** */ public static class TestPage extends MockPageWithLink { private static final long serialVersionUID = 1L; /** */ public TestPage() { add(new Link<Void>(LINK_ID) { private static final long serialVersionUID = 1L; @Override public void onClick() { throw new TestException(); } }); } } }