/** * This file Copyright (c) 2003-2012 Magnolia International * Ltd. (http://www.magnolia-cms.com). All rights reserved. * * * This file is dual-licensed under both the Magnolia * Network Agreement and the GNU General Public License. * You may elect to use one or the other of these licenses. * * This file is distributed in the hope that it will be * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT. * Redistribution, except as permitted by whichever of the GPL * or MNA you select, is prohibited. * * 1. For the GPL license (GPL), you can redistribute and/or * modify this file under the terms of the GNU General * Public License, Version 3, as published by the Free Software * Foundation. You should have received a copy of the GNU * General Public License, Version 3 along with this program; * if not, write to the Free Software Foundation, Inc., 51 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * 2. For the Magnolia Network Agreement (MNA), this file * and the accompanying materials are made available under the * terms of the MNA which accompanies this distribution, and * is available at http://www.magnolia-cms.com/mna.html * * Any modifications to this file must keep this entire header * intact. * */ package info.magnolia.cms.filters; import info.magnolia.cms.core.AggregationState; import info.magnolia.context.Context; import info.magnolia.context.MgnlContext; import info.magnolia.jcr.util.MetaDataUtil; import info.magnolia.jcr.util.NodeUtil; import info.magnolia.repository.RepositoryConstants; import java.io.IOException; import javax.jcr.LoginException; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Handle intercepted administrative requests. * @version $Id$ */ public class InterceptFilter extends AbstractMgnlFilter { private static final Logger log = LoggerFactory.getLogger(InterceptFilter.class); /** * Request parameter: the INTERCEPT holds the name of an administrative action to perform. */ public static final String INTERCEPT = "mgnlIntercept"; /** * Action: sort a paragraph. */ private static final String ACTION_NODE_SORT = "NODE_SORT"; /** * Action: delete a paragraph. */ private static final String ACTION_NODE_DELETE = "NODE_DELETE"; /** * Action: preview a page. */ private static final String ACTION_PREVIEW = "PREVIEW"; /** * request parameter: repository name. */ public static final String PARAM_REPOSITORY = "mgnlRepository"; /** * request parameter: node path, used for paragraph deletion. */ public static final String PARAM_PATH = "mgnlPath"; /** * request parameter: sort-above paragraph. */ private static final String PARAM_PATH_TARGET = "mgnlPathTarget"; /** * request parameter: selected paragraph. */ private static final String PARAM_PATH_SELECTED = "mgnlPathSelected"; /** * Attribute used for enabling the preview mode. */ public static final String MGNL_PREVIEW_ATTRIBUTE = "mgnlPreview"; @Override public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException{ if (request.getParameter(INTERCEPT) != null) { try { this.intercept(request, response); } catch (LoginException e) { throw new ServletException(e); } catch (RepositoryException e) { throw new ServletException(e); } } final AggregationState aggregationState = MgnlContext.getAggregationState(); aggregationState.setPreviewMode(previewMode()); chain.doFilter(request, response); } protected boolean previewMode() { // first check if its passed as a request parameter if (MgnlContext.getParameter(MGNL_PREVIEW_ATTRIBUTE) != null) { return Boolean.parseBoolean(MgnlContext.getParameter(MGNL_PREVIEW_ATTRIBUTE)); } // then in attributes, i.e the session final Boolean value = (Boolean) MgnlContext.getAttribute(MGNL_PREVIEW_ATTRIBUTE, Context.SESSION_SCOPE); return BooleanUtils.toBoolean(value); } /** * Request and Response here is same as received by the original page so it includes all post/get data. Sub action * could be called from here once this action finishes, it will continue loading the requested page. * @throws RepositoryException * @throws LoginException */ public void intercept(HttpServletRequest request, HttpServletResponse response) throws LoginException, RepositoryException { final AggregationState aggregationState = MgnlContext.getAggregationState(); String action = request.getParameter(INTERCEPT); String repository = request.getParameter(PARAM_REPOSITORY); String nodePath = request.getParameter(PARAM_PATH); String handle = aggregationState.getHandle(); String channel = aggregationState.getChannel().getName(); if (repository == null) { repository = aggregationState.getRepository(); } if (repository == null) { repository = RepositoryConstants.WEBSITE; } final Session session = MgnlContext.getJCRSession(repository); if (ACTION_PREVIEW.equals(action)) { // preview mode (button in main bar) String preview = request.getParameter(MGNL_PREVIEW_ATTRIBUTE); log.debug("preview request parameter value is {} ", preview); if (preview != null) { if (Boolean.parseBoolean(preview)) { MgnlContext.setAttribute(MGNL_PREVIEW_ATTRIBUTE, Boolean.TRUE, Context.SESSION_SCOPE); MgnlContext.setAttribute(MultiChannelFilter.ENFORCE_CHANNEL_PARAMETER, channel, Context.SESSION_SCOPE); } else { MgnlContext.removeAttribute(MGNL_PREVIEW_ATTRIBUTE, Context.SESSION_SCOPE); MgnlContext.removeAttribute(MultiChannelFilter.ENFORCE_CHANNEL_PARAMETER, Context.SESSION_SCOPE); } } else { MgnlContext.removeAttribute(MGNL_PREVIEW_ATTRIBUTE, Context.SESSION_SCOPE); MgnlContext.removeAttribute(MultiChannelFilter.ENFORCE_CHANNEL_PARAMETER, Context.SESSION_SCOPE); } } else if (ACTION_NODE_DELETE.equals(action)) { // delete paragraph try { Node page = session.getNode(handle); session.removeItem(nodePath); MetaDataUtil.updateMetaData(page); session.save(); } catch (RepositoryException e) { log.error("Exception caught: {}", e.getMessage(), e); } } else if (ACTION_NODE_SORT.equals(action)) { // sort paragraphs try { String pathSelected = request.getParameter(PARAM_PATH_SELECTED); String pathTarget = request.getParameter(PARAM_PATH_TARGET); String pathParent = StringUtils.substringBeforeLast(pathSelected, "/"); String srcName = StringUtils.substringAfterLast(pathSelected, "/"); String destName = StringUtils.substringAfterLast(pathTarget, "/"); String order = StringUtils.defaultIfEmpty(request.getParameter("order"), "before"); if (StringUtils.equalsIgnoreCase(destName, "mgnlNew")) { destName = null; } Node parent = session.getNode(pathParent + srcName); if ("before".equals(order)) { NodeUtil.orderBefore(parent, destName); } else { NodeUtil.orderAfter(parent, destName); } Node page = session.getNode(handle); MetaDataUtil.updateMetaData(page); session.save(); } catch (RepositoryException e) { log.error("Exception caught: {}", e.getMessage(), e); } } else { log.warn("Unknown action {}", action); } } }