/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* 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 com.xpn.xwiki.web;
import org.apache.commons.lang3.StringUtils;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
/**
* <p>
* Action for previewing document changes. It prepares a temporarily changed document which is placed in the context,
* without actually saving anything. The response is normally rendered by the {@code preview.vm} template.
* </p>
* <p>
* This action also works like a request dispatcher, an early work-around for the fact that in HTML a form can only have
* one destination URL. Thus, the form had to be submitted to one action which would further dispatch the request to
* other actions, based on the clicked form button. Since preview is the safest method of the possible form actions, it
* was chosen as the dispatcher. Currently this functionality is deprecated and maintained only for backwards
* compatibility with older skins, since a cleaner dispatcher was implemented in {@link ActionFilter}.
* </p>
*
* @version $Id: 878c3503149afb89b6de0740065220d27ec46551 $
*/
public class PreviewAction extends EditAction
{
/**
* Default constructor.
*/
public PreviewAction()
{
this.waitForXWikiInitialization = true;
}
/**
* Check if a certain action was selected by the user. This is needed in older skins, which don't make use of the
* {@link ActionFilter}'s dispatcher functionality, but rely on detecting the submit button that was clicked.
*
* @param action the request parameter value that should be tested
* @return {@code true} if the value is a non-empty string, {@code false} otherwise
*/
private boolean isActionSelected(String action)
{
return StringUtils.isNotEmpty(action);
}
@Override
public boolean action(XWikiContext context) throws XWikiException
{
XWikiRequest request = context.getRequest();
String formactionsave = request.getParameter("formactionsave");
String formactioncancel = request.getParameter("formactioncancel");
String formactionsac = request.getParameter("formactionsac");
if (isActionSelected(formactionsave)) {
SaveAction sa = new SaveAction();
if (sa.action(context)) {
sa.render(context);
}
return false;
}
if (isActionSelected(formactioncancel)) {
CancelAction ca = new CancelAction();
if (ca.action(context)) {
ca.render(context);
}
return false;
}
if (isActionSelected(formactionsac)) {
SaveAndContinueAction saca = new SaveAndContinueAction();
if (saca.action(context)) {
saca.render(context);
}
return false;
}
return true;
}
@Override
public String render(XWikiContext context) throws XWikiException
{
XWikiDocument editedDocument = prepareEditedDocument(context);
// The current user editing the document should be displayed as author and creator (if the edited document is
// new) when the edited document is previewed.
editedDocument.setAuthorReference(context.getUserReference());
if (editedDocument.isNew()) {
editedDocument.setCreatorReference(context.getUserReference());
}
// Make sure the current user doesn't use the programming rights of the previous content author (by editing a
// document saved with programming rights, changing it and then previewing it). Also make sure the code
// requiring programming rights is executed in preview mode if the current user has programming rights.
editedDocument.setContentAuthorReference(context.getUserReference());
// Reconfirm edit (captcha) when jcaptcha is not correct.
Boolean reCheckCaptcha = (Boolean) context.get("recheckcaptcha");
return reCheckCaptcha != null && reCheckCaptcha ? "captcha" : "preview";
}
}