Files
alfresco-community-repo/source/java/org/alfresco/repo/webdav/PutMethod.java
Dave Ward 715853507e Merged V3.2 to HEAD
19614: ALF-1890: Merged V2.2 to V3.2
      17709: Merged DEV_TEMPORARY to V2.2
         17700: ETWOTWO-1393: concurrent writes to webdav lead to data loss (0kb resulting file)
      19613: Merged DEV/BELARUS/V2.2-2010_02_03 to V2.2
         19157: ALF-1890: concurrent writes to webdav lead to data loss (0kb resulting file)
   19562: Merged DEV/BELARUS/V3.2-2010_02_24 to V3.2
      19244: ALF-1816: Email templates can no longer be selected when creating a rule for the action 'Send email to specified users' following an upgrade
         - New patch has been created to create invite email templates and notify email templates folders if those are absent. Also it moves 
default notify and invite templates into appropriate folders. 
   19561: Merged DEV/BELARUS/V3.2-2010_02_24 to V3.2 (With improvements)
      19294: ALF-929: email to invite external users does not allow external users to login (no credentails)
         - Always create a password for created users if the authentication chain allows account creation


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19615 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2010-03-27 12:02:24 +00:00

202 lines
6.7 KiB
Java

/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.webdav;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.encoding.ContentCharsetFinder;
import org.alfresco.service.cmr.model.FileExistsException;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.model.FileNotFoundException;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.TempFileProvider;
import org.springframework.util.FileCopyUtils;
/**
* Implements the WebDAV PUT method
*
* @author Gavin Cornwell
*/
public class PutMethod extends WebDAVMethod
{
// Request parameters
private String m_strLockToken = null;
private String m_strContentType = null;
private boolean m_expectHeaderPresent = false;
private File requestBody = null;
/**
* Default constructor
*/
public PutMethod()
{
}
/**
* Parse the request headers
*
* @exception WebDAVServerException
*/
protected void parseRequestHeaders() throws WebDAVServerException
{
m_strContentType = m_request.getHeader(WebDAV.HEADER_CONTENT_TYPE);
String strExpect = m_request.getHeader(WebDAV.HEADER_EXPECT);
if (strExpect != null && strExpect.equals(WebDAV.HEADER_EXPECT_CONTENT))
{
m_expectHeaderPresent = true;
}
// Parse Lock tokens and ETags, if any
parseIfHeader();
}
/**
* Parse the request body
*
* @exception WebDAVServerException
*/
protected void parseRequestBody() throws WebDAVServerException
{
requestBody = TempFileProvider.createTempFile("webdav_PUT_", ".bin");
try
{
OutputStream out = new FileOutputStream(requestBody);
FileCopyUtils.copy(m_request.getInputStream(), out);
}
catch (IOException e)
{
throw new WebDAVServerException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
}
}
/**
* Exceute the WebDAV request
*
* @exception WebDAVServerException
*/
protected void executeImpl() throws WebDAVServerException, Exception
{
FileFolderService fileFolderService = getFileFolderService();
// Get the status for the request path
FileInfo contentNodeInfo = null;
boolean created = false;
try
{
contentNodeInfo = getDAVHelper().getNodeForPath(getRootNodeRef(), getPath(), getServletPath());
// make sure that we are not trying to use a folder
if (contentNodeInfo.isFolder())
{
throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST);
}
checkNode(contentNodeInfo);
}
catch (FileNotFoundException e)
{
// the file doesn't exist - create it
String[] paths = getDAVHelper().splitPath(getPath());
try
{
FileInfo parentNodeInfo = getDAVHelper().getNodeForPath(getRootNodeRef(), paths[0], getServletPath());
// create file
contentNodeInfo = fileFolderService.create(parentNodeInfo.getNodeRef(), paths[1], ContentModel.TYPE_CONTENT);
created = true;
// apply the titled aspect - title and description
Map<QName, Serializable> titledProps = new HashMap<QName, Serializable>(3, 1.0f);
titledProps.put(ContentModel.PROP_TITLE, paths[1]);
titledProps.put(ContentModel.PROP_DESCRIPTION, "");
getNodeService().addAspect(contentNodeInfo.getNodeRef(), ContentModel.ASPECT_TITLED, titledProps);
}
catch (FileNotFoundException ee)
{
// bad path
throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST);
}
catch (FileExistsException ee)
{
// bad path
throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST);
}
}
// Access the content
ContentWriter writer = fileFolderService.getWriter(contentNodeInfo.getNodeRef());
// set content properties
String mimetype = null;
if (m_strContentType != null)
{
mimetype = m_strContentType;
}
else
{
String guessedMimetype = getMimetypeService().guessMimetype(getPath());
mimetype = guessedMimetype;
}
writer.setMimetype(mimetype);
// Get the input stream from the request data
InputStream is = new FileInputStream(requestBody);
is = is.markSupported() ? is : new BufferedInputStream(is);
ContentCharsetFinder charsetFinder = getMimetypeService().getContentCharsetFinder();
Charset encoding = charsetFinder.getCharset(is, mimetype);
writer.setEncoding(encoding.name());
// Write the new data to the content node
writer.putContent(is);
// Set the response status, depending if the node existed or not
m_response.setStatus(created ? HttpServletResponse.SC_CREATED : HttpServletResponse.SC_NO_CONTENT);
}
@Override
protected void cleanup()
{
try
{
requestBody.delete();
}
catch (Throwable t)
{
logger.error("Failed to delete temp file", t);
}
}
}