📄 cmsflexrequest.java
字号:
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/flex/CmsFlexRequest.java,v $
* Date : $Date: 2007-08-13 16:30:10 $
* Version: $Revision: 1.39 $
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) 2002 - 2007 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.flex;
import org.opencms.file.CmsObject;
import org.opencms.file.history.CmsHistoryResourceHandler;
import org.opencms.main.CmsEvent;
import org.opencms.main.CmsLog;
import org.opencms.main.I_CmsEventListener;
import org.opencms.main.OpenCms;
import org.opencms.security.CmsRole;
import org.opencms.staticexport.CmsLinkManager;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.logging.Log;
/**
* Wrapper class for a HttpServletRequest.<p>
*
* This class wraps the standard HttpServletRequest so that it's output can be delivered to
* the CmsFlexCache.<p>
*
* @author Alexander Kandzior
*
* @version $Revision: 1.39 $
*
* @since 6.0.0
*/
public class CmsFlexRequest extends HttpServletRequestWrapper {
/** Request parameter for FlexCache commands. */
public static final String PARAMETER_FLEX = "_flex";
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsFlexRequest.class);
/** Flag to decide if this request can be cached or not. */
private boolean m_canCache;
/** The CmsFlexController for this request. */
private CmsFlexController m_controller;
/** Flag to force a JSP recompile. */
private boolean m_doRecompile;
/** The requested resources element URI in the OpenCms VFS. */
private String m_elementUri;
/** The site root of the requested resource. */
private String m_elementUriSiteRoot;
/** List of all include calls (to prevent an endless inclusion loop). */
private List m_includeCalls;
/** Flag to check if this request is in the online project or not. */
private boolean m_isOnline;
/** The CmsFlexRequestKey for this request. */
private CmsFlexRequestKey m_key;
/** Map of parameters from the original request. */
private Map m_parameters;
/** Stores the request URI after it was once calculated. */
private String m_requestUri;
/** Stores the request URL after it was once calculated. */
private StringBuffer m_requestUrl;
/**
* Creates a new CmsFlexRequest wrapper which is most likley the "Top"
* request wrapper, i.e. the wrapper that is constructed around the
* first "real" (not wrapped) request.<p>
*
* @param req the request to wrap
* @param controller the controller to use
*/
public CmsFlexRequest(HttpServletRequest req, CmsFlexController controller) {
super(req);
m_controller = controller;
CmsObject cms = m_controller.getCmsObject();
m_elementUri = cms.getSitePath(m_controller.getCmsResource());
m_elementUriSiteRoot = cms.getRequestContext().getSiteRoot();
m_includeCalls = new Vector();
m_parameters = req.getParameterMap();
m_isOnline = cms.getRequestContext().currentProject().isOnlineProject();
String[] paras = req.getParameterValues(PARAMETER_FLEX);
boolean nocachepara = CmsHistoryResourceHandler.isHistoryRequest(req);
boolean dorecompile = false;
if (paras != null) {
if (OpenCms.getRoleManager().hasRole(cms, CmsRole.WORKPLACE_MANAGER)) {
List l = Arrays.asList(paras);
boolean firstCall = controller.isEmptyRequestList();
nocachepara |= l.contains("nocache");
dorecompile = l.contains("recompile");
boolean p_on = l.contains("online");
boolean p_off = l.contains("offline");
if (l.contains("purge") && firstCall) {
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_PURGE_JSP_REPOSITORY,
new HashMap(0)));
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR,
Collections.singletonMap("action", new Integer(CmsFlexCache.CLEAR_ENTRIES))));
dorecompile = false;
} else if ((l.contains("clearcache") || dorecompile) && firstCall) {
if (!(p_on || p_off)) {
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR,
Collections.singletonMap("action", new Integer(CmsFlexCache.CLEAR_ALL))));
} else {
if (p_on) {
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR,
Collections.singletonMap("action", new Integer(CmsFlexCache.CLEAR_ONLINE_ALL))));
}
if (p_off) {
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR,
Collections.singletonMap("action", new Integer(CmsFlexCache.CLEAR_OFFLINE_ALL))));
}
}
} else if (l.contains("clearvariations") && firstCall) {
if (!(p_on || p_off)) {
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR,
Collections.singletonMap("action", new Integer(CmsFlexCache.CLEAR_ENTRIES))));
} else {
if (p_on) {
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR,
Collections.singletonMap("action", new Integer(CmsFlexCache.CLEAR_ONLINE_ENTRIES))));
}
if (p_off) {
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR,
Collections.singletonMap("action", new Integer(CmsFlexCache.CLEAR_OFFLINE_ENTRIES))));
}
}
}
}
}
m_canCache = (((m_isOnline || m_controller.getCmsCache().cacheOffline()) && !nocachepara) || dorecompile);
m_doRecompile = dorecompile;
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXREQUEST_CREATED_NEW_REQUEST_1, m_elementUri));
}
}
/**
* Constructs a new wrapper layer around an (already wrapped) CmsFlexRequest.<p>
*
* @param req the request to be wrapped
* @param controller the controller to use
* @param resource the target resource that has been requested
*/
CmsFlexRequest(HttpServletRequest req, CmsFlexController controller, String resource) {
super(req);
m_controller = controller;
m_elementUri = CmsLinkManager.getAbsoluteUri(resource, m_controller.getCurrentRequest().getElementUri());
m_elementUriSiteRoot = m_controller.getCurrentRequest().m_elementUriSiteRoot;
m_isOnline = m_controller.getCurrentRequest().isOnline();
m_canCache = m_controller.getCurrentRequest().isCacheable();
m_doRecompile = m_controller.getCurrentRequest().isDoRecompile();
m_includeCalls = m_controller.getCurrentRequest().getCmsIncludeCalls();
m_parameters = req.getParameterMap();
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXREQUEST_REUSING_FLEX_REQUEST_1, m_elementUri));
}
}
/**
* Adds the specified Map to the paramters of the request,
* added parametes will not overwrite existing parameters in the
* request.<p>
*
* Remember that the value for a parameter name in
* a HttpRequest is a String array. If a parameter name already
* exists in the HttpRequest, the values will be added to the existing
* value array. Multiple occurences of the same value for one
* paramter are also possible.<p>
*
* @param map the map to add
* @return the merged map of parameters
*/
public Map addParameterMap(Map map) {
if (map == null) {
return m_parameters;
}
if ((m_parameters == null) || (m_parameters.size() == 0)) {
m_parameters = Collections.unmodifiableMap(map);
} else {
HashMap parameters = new HashMap();
parameters.putAll(m_parameters);
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String key = (String)entry.getKey();
// Check if the parameter name (key) exists
if (parameters.containsKey(key)) {
String[] oldValues = (String[])parameters.get(key);
String[] newValues = (String[])entry.getValue();
String[] mergeValues = new String[oldValues.length + newValues.length];
System.arraycopy(newValues, 0, mergeValues, 0, newValues.length);
System.arraycopy(oldValues, 0, mergeValues, newValues.length, oldValues.length);
parameters.put(key, mergeValues);
} else {
// No: Add new value array
parameters.put(key, entry.getValue());
}
}
m_parameters = Collections.unmodifiableMap(parameters);
}
return m_parameters;
}
/**
* Returns the full element URI site root path to the resource currently processed.<p>
*
* @return the name of the resource currently processed
*/
public String getElementRootPath() {
return m_controller.getCmsObject().getRequestContext().addSiteRoot(m_elementUriSiteRoot, m_elementUri);
}
/**
* Returns the element URI of the resource currently processed,
* relative to the current site root.<p>
*
* This might be the name of an included resource,
* not neccesarily the name the resource requested by the user.
*
* @return the name of the resource currently processed
*/
public String getElementUri() {
return m_elementUri;
}
/**
* Return the value of the specified request parameter, if any; otherwise,
* return <code>null</code>.<p>
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -