001/*
002 * Copyright 2002-2012 the original author or authors.
003 *
004 * Licensed under the Apache 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 *      https://www.apache.org/licenses/LICENSE-2.0
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 */
016
017package org.springframework.web.portlet.mvc;
018
019import javax.portlet.ActionRequest;
020import javax.portlet.ActionResponse;
021import javax.portlet.EventRequest;
022import javax.portlet.EventResponse;
023import javax.portlet.PortletContext;
024import javax.portlet.RenderRequest;
025import javax.portlet.RenderResponse;
026import javax.portlet.ResourceRequest;
027import javax.portlet.ResourceResponse;
028
029import org.springframework.web.portlet.HandlerAdapter;
030import org.springframework.web.portlet.ModelAndView;
031import org.springframework.web.portlet.context.PortletContextAware;
032import org.springframework.web.portlet.util.PortletUtils;
033
034/**
035 * Adapter to use the Controller workflow interface with the generic DispatcherPortlet.
036 *
037 * <p>This is an SPI class, not used directly by application code.
038 *
039 * @author Juergen Hoeller
040 * @author John A. Lewis
041 * @since 2.0
042 * @see org.springframework.web.portlet.DispatcherPortlet
043 * @see Controller
044 * @see ResourceAwareController
045 * @see EventAwareController
046  */
047public class SimpleControllerHandlerAdapter implements HandlerAdapter, PortletContextAware {
048
049        private PortletContext portletContext;
050
051
052        @Override
053        public void setPortletContext(PortletContext portletContext) {
054                this.portletContext = portletContext;
055        }
056
057
058        @Override
059        public boolean supports(Object handler) {
060                return (handler instanceof Controller);
061        }
062
063        @Override
064        public void handleAction(ActionRequest request, ActionResponse response, Object handler)
065                        throws Exception {
066
067                ((Controller) handler).handleActionRequest(request, response);
068        }
069
070        @Override
071        public ModelAndView handleRender(RenderRequest request, RenderResponse response, Object handler)
072                        throws Exception {
073
074                return ((Controller) handler).handleRenderRequest(request, response);
075        }
076
077        @Override
078        public ModelAndView handleResource(ResourceRequest request, ResourceResponse response, Object handler)
079                        throws Exception {
080
081                if (handler instanceof ResourceAwareController) {
082                        return ((ResourceAwareController) handler).handleResourceRequest(request, response);
083                }
084                else {
085                        // equivalent to Portlet 2.0 GenericPortlet
086                        PortletUtils.serveResource(request, response, this.portletContext);
087                        return null;
088                }
089        }
090
091        @Override
092        public void handleEvent(EventRequest request, EventResponse response, Object handler) throws Exception {
093                if (handler instanceof EventAwareController) {
094                        ((EventAwareController) handler).handleEventRequest(request, response);
095                }
096                else {
097                        // if no event processing method was found just keep render params
098                        response.setRenderParameters(request);
099                }
100        }
101
102}