001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.apache.bridges.struts;
016    
017    import com.liferay.portal.kernel.util.CharPool;
018    import com.liferay.portal.kernel.util.JavaConstants;
019    import com.liferay.portal.kernel.util.StringPool;
020    import com.liferay.portal.model.Portlet;
021    import com.liferay.portal.model.PortletApp;
022    import com.liferay.portlet.PortletRequestImpl;
023    import com.liferay.portlet.PortletResponseImpl;
024    import com.liferay.portlet.PortletServletRequest;
025    import com.liferay.portlet.PortletServletResponse;
026    
027    import java.io.IOException;
028    
029    import java.util.Set;
030    
031    import javax.portlet.PortletRequest;
032    import javax.portlet.PortletResponse;
033    
034    import javax.servlet.RequestDispatcher;
035    import javax.servlet.ServletException;
036    import javax.servlet.ServletRequest;
037    import javax.servlet.ServletResponse;
038    import javax.servlet.http.HttpServletRequest;
039    import javax.servlet.http.HttpServletResponse;
040    
041    /**
042     * @author Michael Young
043     * @author Brian Myunghun Kim
044     * @author Brian Wing Shun Chan
045     * @author Deepak Gothe
046     */
047    public class LiferayRequestDispatcher implements RequestDispatcher {
048    
049            public LiferayRequestDispatcher(
050                    RequestDispatcher requestDispatcher, String path) {
051    
052                    _requestDispatcher = requestDispatcher;
053                    _path = path;
054            }
055    
056            public void forward(
057                            ServletRequest servletRequest, ServletResponse servletResponse)
058                    throws IOException, ServletException {
059    
060                    PortletRequest portletRequest =
061                            (PortletRequest)servletRequest.getAttribute(
062                                    JavaConstants.JAVAX_PORTLET_REQUEST);
063    
064                    if (portletRequest != null) {
065                            invoke(servletRequest, servletResponse, false);
066                    }
067                    else {
068                            _requestDispatcher.forward(servletRequest, servletResponse);
069                    }
070            }
071    
072            public void include(
073                            ServletRequest servletRequest, ServletResponse servletResponse)
074                    throws IOException, ServletException {
075    
076                    PortletRequest portletRequest =
077                            (PortletRequest)servletRequest.getAttribute(
078                                    JavaConstants.JAVAX_PORTLET_REQUEST);
079    
080                    if (portletRequest != null) {
081                            invoke(servletRequest, servletResponse, true);
082                    }
083                    else {
084                            _requestDispatcher.include(servletRequest, servletResponse);
085                    }
086            }
087    
088            public void invoke(
089                            ServletRequest servletRequest, ServletResponse servletResponse,
090                            boolean include)
091                    throws IOException, ServletException {
092    
093                    String pathInfo = null;
094                    String queryString = null;
095                    String requestURI = null;
096                    String servletPath = null;
097    
098                    PortletRequest portletRequest =
099                            (PortletRequest)servletRequest.getAttribute(
100                                    JavaConstants.JAVAX_PORTLET_REQUEST);
101    
102                    PortletResponse portletResponse =
103                            (PortletResponse)servletRequest.getAttribute(
104                                    JavaConstants.JAVAX_PORTLET_RESPONSE);
105    
106                    if (_path != null) {
107                            String pathNoQueryString = _path;
108    
109                            int pos = _path.indexOf(CharPool.QUESTION);
110    
111                            if (pos != -1) {
112                                    pathNoQueryString = _path.substring(0, pos);
113                                    queryString = _path.substring(pos + 1, _path.length());
114                            }
115    
116                            Set<String> servletURLPatterns = getServletURLPatterns(
117                                    servletRequest, portletRequest, portletResponse);
118    
119                            for (String urlPattern : servletURLPatterns) {
120                                    if (urlPattern.endsWith("/*")) {
121                                            pos = urlPattern.indexOf("/*");
122    
123                                            urlPattern = urlPattern.substring(0, pos);
124    
125                                            if (pathNoQueryString.startsWith(urlPattern)) {
126                                                    pathInfo = pathNoQueryString.substring(
127                                                            urlPattern.length());
128                                                    servletPath = urlPattern;
129    
130                                                    break;
131                                            }
132                                    }
133                            }
134    
135                            if ((pathInfo == null) && (servletPath == null)) {
136                                    pathInfo = StringPool.BLANK;
137                                    servletPath = pathNoQueryString;
138                            }
139    
140                            requestURI = portletRequest.getContextPath() + pathNoQueryString;
141                    }
142    
143                    HttpServletRequest portletServletRequest = getPortletServletRequest(
144                            servletRequest, portletRequest, pathInfo, queryString, requestURI,
145                            servletPath, include);
146    
147                    HttpServletResponse portletServletResponse =
148                            getPortletServletResponse(
149                                    servletResponse, portletRequest, portletResponse, include);
150    
151                    if (include) {
152                            _requestDispatcher.include(
153                                    portletServletRequest, portletServletResponse);
154                    }
155                    else {
156                            _requestDispatcher.forward(
157                                    portletServletRequest, portletServletResponse);
158                    }
159            }
160    
161            protected HttpServletRequest getPortletServletRequest(
162                    ServletRequest servletRequest, PortletRequest portletRequest,
163                    String pathInfo, String queryString, String requestURI,
164                    String servletPath, boolean include) {
165    
166                    HttpServletRequest request = (HttpServletRequest)servletRequest;
167                    boolean named = false;
168    
169                    PortletRequestImpl portletRequestImpl =
170                            (PortletRequestImpl)portletRequest;
171    
172                    return new PortletServletRequest(
173                            request, portletRequestImpl, pathInfo, queryString, requestURI,
174                            servletPath, named, include);
175            }
176    
177            protected HttpServletResponse getPortletServletResponse(
178                    ServletResponse servletResponse, PortletRequest portletRequest,
179                    PortletResponse portletResponse, boolean include) {
180    
181                    HttpServletResponse response = (HttpServletResponse)servletResponse;
182    
183                    PortletResponseImpl portletResponseImpl =
184                            (PortletResponseImpl)portletResponse;
185    
186                    return new PortletServletResponse(
187                            response, portletResponseImpl, include);
188            }
189    
190            protected Set<String> getServletURLPatterns(
191                    ServletRequest servletRequest, PortletRequest portletRequest,
192                    PortletResponse portletResponse) {
193    
194                    PortletRequestImpl portletRequestImpl =
195                            (PortletRequestImpl)portletRequest;
196    
197                    Portlet portlet = portletRequestImpl.getPortlet();
198    
199                    PortletApp portletApp = portlet.getPortletApp();
200    
201                    return portletApp.getServletURLPatterns();
202            }
203    
204            private RequestDispatcher _requestDispatcher;
205            private String _path;
206    
207    }