/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/rwiki/trunk/rwiki-tool/tool/src/java/uk/ac/cam/caret/sakai/rwiki/tool/command/SaveCommand.java $
* $Id: SaveCommand.java 58932 2009-03-20 22:09:18Z s.swinsburg@lancaster.ac.uk $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006 The Sakai Foundation.
*
* Licensed under the Educational Community License, Version 1.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ecl1.php
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package uk.ac.cam.caret.sakai.rwiki.tool.command;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.api.ComponentManager;
import org.sakaiproject.content.api.FilePickerHelper;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.tool.api.ToolSession;
import uk.ac.cam.caret.sakai.rwiki.service.api.RWikiObjectService;
import uk.ac.cam.caret.sakai.rwiki.service.exception.PermissionException;
import uk.ac.cam.caret.sakai.rwiki.service.exception.VersionException;
import uk.ac.cam.caret.sakai.rwiki.tool.RWikiServlet;
import uk.ac.cam.caret.sakai.rwiki.tool.RequestScopeSuperBean;
import uk.ac.cam.caret.sakai.rwiki.tool.api.HttpCommand;
import uk.ac.cam.caret.sakai.rwiki.tool.bean.EditBean;
import uk.ac.cam.caret.sakai.rwiki.tool.bean.ErrorBean;
import uk.ac.cam.caret.sakai.rwiki.tool.bean.ResourceLoaderBean;
import uk.ac.cam.caret.sakai.rwiki.tool.bean.ViewBean;
import uk.ac.cam.caret.sakai.rwiki.tool.bean.helper.ResourceLoaderHelperBean;
import uk.ac.cam.caret.sakai.rwiki.tool.bean.helper.ViewParamsHelperBean;
import uk.ac.cam.caret.sakai.rwiki.tool.command.helper.ErrorBeanHelper;
import uk.ac.cam.caret.sakai.rwiki.tool.util.WikiPageAction;
import org.sakaiproject.component.cover.ServerConfigurationService;
/**
* @author andrew
*/
public class SaveCommand implements HttpCommand
{
private static Log log = LogFactory.getLog(SaveCommand.class);
private static final String ATTACHMENT_HELPER = "sakai.filepicker";
protected RWikiObjectService objectService;
private String contentChangedPath;
private String noUpdatePath;
private String successfulPath;
private String previewPath;
private String cancelPath;
private SessionManager sessionManager;
public void init()
{
ComponentManager cm = org.sakaiproject.component.cover.ComponentManager
.getInstance();
sessionManager = (SessionManager) load(cm, SessionManager.class
.getName());
objectService = (RWikiObjectService) load(cm, RWikiObjectService.class
.getName());
}
private Object load(ComponentManager cm, String name)
{
Object o = cm.get(name);
if (o == null)
{
log.error("Cant find Spring component named " + name);
}
return o;
}
public void execute(Dispatcher dispatcher, HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
RequestScopeSuperBean rssb = RequestScopeSuperBean
.getFromRequest(request);
ResourceLoaderBean rlb = rssb.getResourceLoaderBean();
ViewParamsHelperBean vphb = (ViewParamsHelperBean) rssb
.getNameHelperBean();
String tid = org.sakaiproject.tool.cover.ToolManager.getCurrentPlacement().getId();
String content = vphb.getContent();
String save = vphb.getSaveType();
String name = vphb.getGlobalName();
String realm = vphb.getLocalSpace();
if (save == null)
{
save = EditBean.SAVE_VALUE;
}
if (save.equals(EditBean.OVERWRITE_VALUE))
{
content = vphb.getSubmittedContent();
// Set the content as the submitted content in case we have a
// version exception
vphb.setContent(content);
}
else if (save.equals(EditBean.PREVIEW_VALUE))
{
vphb.setSaveState(ViewParamsHelperBean.SAVE_PREVIEW);
this.previewDispatch(dispatcher,request, response);
return;
}
else if (save.equals(EditBean.LINK_ATTACHMENT_VALUE)
|| save.equals(EditBean.EMBED_ATTACHMENT_VALUE))
{
ToolSession session = sessionManager.getCurrentToolSession();
Map parameterMap = request.getParameterMap();
session.setAttribute("STORED_PARAMETERS", parameterMap);
ViewBean vb = rssb.getViewBean();
// FIXME Knowledge of URL structure assumed!
WikiPageAction returnAction = WikiPageAction.LINK_ATTACHMENT_RETURN_ACTION;
if (save.equals(EditBean.EMBED_ATTACHMENT_VALUE))
{
returnAction = WikiPageAction.EMBED_ATTACHMENT_RETURN_ACTION;
}
// SAK-13408 - Tomcat and WAS have different URL structures; Attempting to add a
// link or image would lead to site unavailable errors in websphere if the tomcat
// URL structure is used.
if("websphere".equals(ServerConfigurationService.getString("servlet.container"))){
session.setAttribute(ATTACHMENT_HELPER + Tool.HELPER_DONE_URL,
request.getContextPath() + request.getServletPath()
+ "/tool/" + tid + vb.getActionUrl(returnAction, true));
}
else {
session.setAttribute(ATTACHMENT_HELPER + Tool.HELPER_DONE_URL,
request.getContextPath() + request.getServletPath()
+ vb.getActionUrl(returnAction, true));
}
session.setAttribute(FilePickerHelper.FILE_PICKER_ATTACH_LINKS,
FilePickerHelper.FILE_PICKER_ATTACH_LINKS);
String fromText;
if (returnAction
.equals(WikiPageAction.LINK_ATTACHMENT_RETURN_ACTION))
{
fromText = vb.getLocalName() + rlb.getString("save.as_link"," as link");
}
else
{
fromText = vb.getLocalName() + rlb.getString("save.as_embed"," as embed");
}
session.setAttribute(FilePickerHelper.FILE_PICKER_FROM_TEXT,
fromText);
if("websphere".equals(ServerConfigurationService.getString("servlet.container"))){
//WS-57 - In Websphere the URL which the user is directed to contains a duplicate tool id. This fix will remove the
//dulpicate tool id that is passed in to the method sendRedirect() as the url being built
response.sendRedirect("helper/" + ATTACHMENT_HELPER + "/tool");
}
else{
response.sendRedirect(request.getContextPath()
+ request.getServletPath() + "/helper/" + ATTACHMENT_HELPER
+ "/tool");
}
return;
}
else if (save.equals(EditBean.CANCEL_VALUE))
{
vphb.setSaveState(ViewParamsHelperBean.SAVE_CANCEL);
this.cancelDispatch(dispatcher,request, response);
ViewBean vb = new ViewBean(name, realm);
String requestURL = request.getRequestURL().toString();
sessionManager.getCurrentToolSession().setAttribute(
RWikiServlet.SAVED_REQUEST_URL,
requestURL + vb.getViewUrl());
return;
}
String version = vphb.getSubmittedVersion();
Date versionDate = new Date(Long.parseLong(version));
try
{
doUpdate(name, realm, versionDate, content);
}
catch (VersionException e)
{
// The page has changed underneath us...
// redirect probably back to the edit page
vphb.setSaveState(ViewParamsHelperBean.SAVE_VERSION_EXCEPTION);
this.contentChangedDispatch(dispatcher,request, response);
return;
}
catch (PermissionException e)
{
// Redirect back to a no permission page...
this.noUpdateAllowed(dispatcher,request, response);
return;
}
// Successful update
vphb.setSaveState(ViewParamsHelperBean.SAVE_OK);
this.successfulUpdateDispatch(dispatcher,request, response);
ViewBean vb = new ViewBean(name, realm);
String requestURL = request.getRequestURL().toString();
sessionManager.getCurrentToolSession().setAttribute(
RWikiServlet.SAVED_REQUEST_URL, requestURL + vb.getViewUrl());
return;
}
protected void doUpdate(String name, String realm, Date versionDate,
String content)
{
objectService.update(name, realm, versionDate, content);
}
private void cancelDispatch(Dispatcher dispatcher,HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
dispatcher.dispatch(cancelPath,request, response);
}
private void previewDispatch(Dispatcher dispatcher,HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
dispatcher.dispatch(previewPath,request, response);
}
protected void successfulUpdateDispatch(Dispatcher dispatcher,HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
dispatcher.dispatch(successfulPath,request, response);
}
private void contentChangedDispatch(Dispatcher dispatcher,HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
ErrorBean errorBean = ErrorBeanHelper.getErrorBean(request);
ResourceLoaderBean rlb = ResourceLoaderHelperBean.getResourceLoader(request);
errorBean
.addError(rlb.getString("save.content_changed","Content has changed since you last viewed it. Please update the new content or overwrite it with the submitted content."));
dispatcher.dispatch(contentChangedPath,request, response);
}
private void noUpdateAllowed(Dispatcher dispatcher,HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
ErrorBean errorBean = ErrorBeanHelper.getErrorBean(request);
ResourceLoaderBean rlb = ResourceLoaderHelperBean.getResourceLoader(request);
errorBean.addError(rlb.getString("save.noupdate_permission","You do not have permission to update this page."));
dispatcher.dispatch(noUpdatePath,request, response);
}
public String getSuccessfulPath()
{
return successfulPath;
}
public void setSuccessfulPath(String successfulPath)
{
this.successfulPath = successfulPath;
}
public String getContentChangedPath()
{
return contentChangedPath;
}
public void setContentChangedPath(String contentChangedPath)
{
this.contentChangedPath = contentChangedPath;
}
public String getNoUpdatePath()
{
return noUpdatePath;
}
public void setNoUpdatePath(String noUpdatePath)
{
this.noUpdatePath = noUpdatePath;
}
public String getPreviewPath()
{
return previewPath;
}
public void setPreviewPath(String previewPath)
{
this.previewPath = previewPath;
}
public String getCancelPath()
{
return cancelPath;
}
public void setCancelPath(String cancelPath)
{
this.cancelPath = cancelPath;
}
}