001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.servlet;
016    
017    import com.liferay.portal.kernel.util.GetterUtil;
018    import com.liferay.portal.kernel.util.ObjectValuePair;
019    
020    import java.util.Enumeration;
021    
022    import javax.servlet.DispatcherType;
023    import javax.servlet.RequestDispatcher;
024    import javax.servlet.http.HttpServletRequest;
025    import javax.servlet.http.HttpServletRequestWrapper;
026    import javax.servlet.http.HttpServletResponse;
027    
028    /**
029     * @author Shuyang Zhou
030     */
031    public class RequestDispatcherUtil {
032    
033            public static ObjectValuePair<String, Long> getContentAndLastModifiedTime(
034                            RequestDispatcher requestDispatcher, HttpServletRequest request,
035                            HttpServletResponse response)
036                    throws Exception {
037    
038                    BufferCacheServletResponse bufferCacheServletResponse =
039                            new BufferCacheServletResponse(response);
040    
041                    requestDispatcher.include(
042                            new HttpServletRequestWrapper(request) {
043    
044                                    @Override
045                                    public long getDateHeader(String name) {
046                                            if (name.equals(HttpHeaders.IF_MODIFIED_SINCE)) {
047                                                    return -1;
048                                            }
049    
050                                            return super.getDateHeader(name);
051                                    }
052    
053                                    @Override
054                                    public String getHeader(String name) {
055                                            if (name.equals(HttpHeaders.IF_MODIFIED_SINCE) ||
056                                                    name.equals(HttpHeaders.IF_NONE_MATCH) ||
057                                                    name.equals(HttpHeaders.LAST_MODIFIED)) {
058    
059                                                    return null;
060                                            }
061    
062                                            return super.getHeader(name);
063                                    }
064    
065                                    @Override
066                                    public Enumeration<String> getHeaders(String name) {
067                                            if (name.equals(HttpHeaders.IF_MODIFIED_SINCE) ||
068                                                    name.equals(HttpHeaders.IF_NONE_MATCH) ||
069                                                    name.equals(HttpHeaders.LAST_MODIFIED)) {
070    
071                                                    return null;
072                                            }
073    
074                                            return super.getHeaders(name);
075                                    }
076    
077                                    @Override
078                                    public String getMethod() {
079                                            return HttpMethods.GET;
080                                    }
081    
082                            },
083                            bufferCacheServletResponse);
084    
085                    return new ObjectValuePair<>(
086                            bufferCacheServletResponse.getString(),
087                            GetterUtil.getLong(
088                                    bufferCacheServletResponse.getHeader(HttpHeaders.LAST_MODIFIED),
089                                    -1));
090            }
091    
092            public static String getEffectivePath(HttpServletRequest request) {
093                    DispatcherType dispatcherType = request.getDispatcherType();
094    
095                    if (dispatcherType.equals(DispatcherType.FORWARD)) {
096                            return (String)request.getAttribute(
097                                    RequestDispatcher.FORWARD_SERVLET_PATH);
098                    }
099                    else if (dispatcherType.equals(DispatcherType.INCLUDE)) {
100                            return (String)request.getAttribute(
101                                    RequestDispatcher.INCLUDE_SERVLET_PATH);
102                    }
103    
104                    return request.getServletPath();
105            }
106    
107            public static long getLastModifiedTime(
108                            RequestDispatcher requestDispatcher, HttpServletRequest request,
109                            HttpServletResponse response)
110                    throws Exception {
111    
112                    MetaInfoCacheServletResponse metaInfoCacheServletResponse =
113                            new MetaInfoCacheServletResponse(response);
114    
115                    requestDispatcher.include(
116                            new HttpServletRequestWrapper(request) {
117    
118                                    @Override
119                                    public String getMethod() {
120                                            return HttpMethods.HEAD;
121                                    }
122    
123                            },
124                            metaInfoCacheServletResponse);
125    
126                    return GetterUtil.getLong(
127                            metaInfoCacheServletResponse.getHeader(HttpHeaders.LAST_MODIFIED),
128                            -1);
129            }
130    
131    }