/*
* Copyright (C) 2010 eXo Platform SAS.
*
* This 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 software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.portletcache;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.EventRequest;
import javax.portlet.EventResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletMode;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.filter.ActionFilter;
import javax.portlet.filter.EventFilter;
import javax.portlet.filter.FilterChain;
import javax.portlet.filter.FilterConfig;
import javax.portlet.filter.PortletFilter;
import javax.portlet.filter.RenderFilter;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.portal.webui.workspace.UIPortalApplication;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class PortletCacheFilter implements PortletFilter, ActionFilter, RenderFilter, EventFilter
{
private static final String EXO_CACHE = "exo.cache";
private static final String TRUE = "true";
private static final String FALSE = "false";
private static final String SHARED_CACHE = "sharedCache";
private static final String TURN_ON_QUICK_EDIT = "turnOnQuickEdit";
private static final String NO_CACHE = "nocache";
public PortletCacheFilter()
{
}
public void init(FilterConfig cfg) throws PortletException
{
}
public void destroy()
{
}
public void doFilter(ActionRequest req, ActionResponse resp, FilterChain chain) throws IOException, PortletException
{
chain.doFilter(req, resp);
}
public void doFilter(EventRequest req, EventResponse resp, FilterChain chain) throws IOException, PortletException
{
chain.doFilter(req, resp);
}
/**
* @return true if current context is PortalEditMode
*/
private boolean isPortalEditMode() {
return Util.getUIPortalApplication().getModeState() != UIPortalApplication.NORMAL_MODE;
}
public void doFilter(RenderRequest req, RenderResponse resp, FilterChain chain) throws IOException, PortletException
{
String exoCacheUsageRequestParam = Util.getPortalRequestContext().getRequestParameter(EXO_CACHE);
PortalRequestContext ctx = (PortalRequestContext)PortalRequestContext.getCurrentInstance();
Boolean quickEdit = (Boolean) ctx.getRequest().getSession().getAttribute(TURN_ON_QUICK_EDIT);
if (quickEdit==null) quickEdit=false;
Boolean sharedCache = TRUE.equals(req.getPreferences().getValue(SHARED_CACHE, FALSE));
PortletMode portletMode = req.getPortletMode();
if (!NO_CACHE.equals(exoCacheUsageRequestParam) && sharedCache &&
(req.getRemoteUser() == null || (!quickEdit && !isPortalEditMode())) &&
!PortletMode.EDIT.equals(portletMode)) {
Map<String, String[]> query = new HashMap<String, String[]>();
query.putAll((Map<String, String[]>)ctx.getRequest().getParameterMap());
query.put("VISIBILITY", new String[] {(req.getRemoteUser()!=null)?"PRIVATE":"PUBLIC"} );
//
String referer = ctx.getRequest().getHeader("referer");
if(referer != null){
query.put("REFERER", new String[] {referer} );
}
query.put("PATH", new String[] {ctx.getRequestURI()} );
Locale locale = ctx.getLocale();
//
WindowKey key = new WindowKey(
req.getWindowID(),
req.getWindowState(),
req.getPortletMode(),
locale,
req.getParameterMap(),
query);
//
FragmentCacheService service = WCMCoreUtils.getService(FragmentCacheService.class);
MarkupFragment value = service.getMarkupFragment(new PortletRenderContext(req, resp, chain), key);
OutputStream out = resp.getPortletOutputStream();
out.write(value.data);
out.close();
}
else
{
chain.doFilter(req, resp);
}
}
}