001/**
002 * Copyright 2005-2018 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.krad.web.controller;
017
018import org.kuali.rice.krad.web.bind.UifServletRequestDataBinderFactory;
019import org.springframework.web.method.annotation.ErrorsMethodArgumentResolver;
020import org.springframework.web.method.annotation.ExpressionValueMethodArgumentResolver;
021import org.springframework.web.method.annotation.MapMethodProcessor;
022import org.springframework.web.method.annotation.ModelMethodProcessor;
023import org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver;
024import org.springframework.web.method.annotation.RequestHeaderMethodArgumentResolver;
025import org.springframework.web.method.annotation.RequestParamMapMethodArgumentResolver;
026import org.springframework.web.method.annotation.RequestParamMethodArgumentResolver;
027import org.springframework.web.method.annotation.SessionStatusMethodArgumentResolver;
028import org.springframework.web.method.support.HandlerMethodArgumentResolver;
029import org.springframework.web.method.support.InvocableHandlerMethod;
030import org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor;
031import org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMapMethodArgumentResolver;
032import org.springframework.web.servlet.mvc.method.annotation.MatrixVariableMethodArgumentResolver;
033import org.springframework.web.servlet.mvc.method.annotation.PathVariableMapMethodArgumentResolver;
034import org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver;
035import org.springframework.web.servlet.mvc.method.annotation.RedirectAttributesMethodArgumentResolver;
036import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
037import org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver;
038import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;
039import org.springframework.web.servlet.mvc.method.annotation.ServletCookieValueMethodArgumentResolver;
040import org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;
041import org.springframework.web.servlet.mvc.method.annotation.ServletRequestDataBinderFactory;
042import org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver;
043import org.springframework.web.servlet.mvc.method.annotation.ServletResponseMethodArgumentResolver;
044import org.springframework.web.servlet.mvc.method.annotation.UriComponentsBuilderMethodArgumentResolver;
045
046import java.util.ArrayList;
047import java.util.List;
048
049/**
050 * Override of request mapping handler apapter to create a custom binder factory.
051 *
052 * @author Kuali Rice Team (rice.collab@kuali.org)
053 */
054public class UifRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {
055
056    /**
057     * {@inheritDoc}
058     */
059    @Override
060    protected ServletRequestDataBinderFactory createDataBinderFactory(
061            List<InvocableHandlerMethod> binderMethods) throws Exception {
062        return new UifServletRequestDataBinderFactory(binderMethods, getWebBindingInitializer());
063    }
064
065    /**
066     * Override to set Uif form argument resolver as first in the list of resolvers.
067     *
068     * {@inheritDoc}
069     */
070    @Override
071    public void afterPropertiesSet() {
072        List<HandlerMethodArgumentResolver> resolvers = getUifArgumentResolvers();
073        setArgumentResolvers(resolvers);
074
075        super.afterPropertiesSet();
076    }
077
078    /**
079     * Return the list of argument resolvers to use including built-in resolvers
080     * and custom resolvers provided via {@link #setCustomArgumentResolvers}.
081     */
082    protected List<HandlerMethodArgumentResolver> getUifArgumentResolvers() {
083        List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();
084
085        resolvers.add(new UifDefaultFormMethodArgumentResolver());
086
087        // Annotation-based argument resolution
088        resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
089        resolvers.add(new RequestParamMapMethodArgumentResolver());
090        resolvers.add(new PathVariableMethodArgumentResolver());
091        resolvers.add(new PathVariableMapMethodArgumentResolver());
092        resolvers.add(new MatrixVariableMethodArgumentResolver());
093        resolvers.add(new MatrixVariableMapMethodArgumentResolver());
094        resolvers.add(new ServletModelAttributeMethodProcessor(false));
095        resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters()));
096        resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));
097        resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
098        resolvers.add(new RequestHeaderMapMethodArgumentResolver());
099        resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
100        resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
101
102        // Type-based argument resolution
103        resolvers.add(new ServletRequestMethodArgumentResolver());
104        resolvers.add(new ServletResponseMethodArgumentResolver());
105        resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));
106        resolvers.add(new RedirectAttributesMethodArgumentResolver());
107        resolvers.add(new ModelMethodProcessor());
108        resolvers.add(new MapMethodProcessor());
109        resolvers.add(new ErrorsMethodArgumentResolver());
110        resolvers.add(new SessionStatusMethodArgumentResolver());
111        resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
112
113        // Custom arguments
114        if (getCustomArgumentResolvers() != null) {
115            resolvers.addAll(getCustomArgumentResolvers());
116        }
117
118        // Catch-all
119        resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));
120        resolvers.add(new ServletModelAttributeMethodProcessor(true));
121
122        return resolvers;
123    }
124}