001// Copyright 2023 The Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014 015package org.apache.tapestry5.internal; 016 017import java.io.IOException; 018import java.util.List; 019 020import org.apache.tapestry5.ComponentResources; 021import org.apache.tapestry5.ExceptionHandlerAssistant; 022import org.apache.tapestry5.SymbolConstants; 023import org.apache.tapestry5.corelib.components.Form; 024import org.apache.tapestry5.services.ComponentSource; 025import org.apache.tapestry5.services.PageRenderLinkSource; 026import org.apache.tapestry5.services.RequestExceptionHandler; 027 028/** 029 * Handles {@link FormsRequirePostException}s (thrown by the {@link Form} component when the request method was 030 * other than post) by redirecting to the page containing the form. 031 * <p> 032 * This assistant is contributed to the default {@link RequestExceptionHandler} service in a way that it is 033 * effective only in production mode. 034 * 035 * @see ExceptionHandlerAssistant 036 * @see RequestExceptionHandler 037 * @see SymbolConstants#PRODUCTION_MODE 038 * @since 5.8.3 039 */ 040public class FormsRequirePostExceptionHandlerAssistant implements ExceptionHandlerAssistant 041{ 042 final ComponentSource componentSource; 043 044 final PageRenderLinkSource linkSource; 045 046 public FormsRequirePostExceptionHandlerAssistant(final ComponentSource componentSource, final PageRenderLinkSource linkSource) 047 { 048 this.componentSource = componentSource; 049 this.linkSource = linkSource; 050 } 051 052 @Override 053 public Object handleRequestException(Throwable exception, List<Object> exceptionContext) throws IOException 054 { 055 ComponentResources cr = componentSource.getActivePage().getComponentResources(); 056 057 String pageName = cr.getPageName(); 058 059 return linkSource.createPageRenderLink(pageName); 060 } 061}