/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library 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 library 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.
*/
package com.liferay.document.library.web.webdav;
import com.liferay.asset.kernel.model.AssetEntry;
import com.liferay.asset.kernel.model.AssetLink;
import com.liferay.asset.kernel.service.AssetCategoryLocalService;
import com.liferay.asset.kernel.service.AssetEntryLocalService;
import com.liferay.asset.kernel.service.AssetLinkLocalService;
import com.liferay.asset.kernel.service.AssetTagLocalService;
import com.liferay.document.library.kernel.exception.DuplicateFileEntryException;
import com.liferay.document.library.kernel.exception.DuplicateFolderNameException;
import com.liferay.document.library.kernel.exception.FileSizeException;
import com.liferay.document.library.kernel.exception.NoSuchFileEntryException;
import com.liferay.document.library.kernel.exception.NoSuchFolderException;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.model.DLFolder;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppService;
import com.liferay.document.library.kernel.service.DLTrashService;
import com.liferay.document.library.kernel.util.DL;
import com.liferay.document.library.web.constants.DLPortletKeys;
import com.liferay.document.library.web.internal.util.DLTrashUtil;
import com.liferay.expando.kernel.model.ExpandoBridge;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.lock.DuplicateLockException;
import com.liferay.portal.kernel.lock.InvalidLockException;
import com.liferay.portal.kernel.lock.Lock;
import com.liferay.portal.kernel.lock.NoSuchLockException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.security.auth.PrincipalException;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.ServiceContextFactory;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.webdav.BaseResourceImpl;
import com.liferay.portal.kernel.webdav.BaseWebDAVStorageImpl;
import com.liferay.portal.kernel.webdav.Resource;
import com.liferay.portal.kernel.webdav.Status;
import com.liferay.portal.kernel.webdav.WebDAVException;
import com.liferay.portal.kernel.webdav.WebDAVRequest;
import com.liferay.portal.kernel.webdav.WebDAVStorage;
import com.liferay.portal.kernel.webdav.WebDAVUtil;
import com.liferay.portal.webdav.LockException;
import com.liferay.portlet.documentlibrary.webdav.DLFileEntryResourceImpl;
import com.liferay.portlet.documentlibrary.webdav.DLWebDAVUtil;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Brian Wing Shun Chan
* @author Alexander Chow
*/
@Component(
immediate = true,
property = {
"javax.portlet.name=" + DLPortletKeys.DOCUMENT_LIBRARY,
"javax.portlet.name=" + DLPortletKeys.DOCUMENT_LIBRARY_ADMIN,
"javax.portlet.name=" + DLPortletKeys.MEDIA_GALLERY_DISPLAY,
"webdav.storage.token=document_library"
},
service = WebDAVStorage.class
)
public class DLWebDAVStorageImpl extends BaseWebDAVStorageImpl {
public static final String MS_OFFICE_2010_TEXT_XML_UTF8 =
"text/xml; charset=\"utf-8\"";
@Override
public int copyCollectionResource(
WebDAVRequest webDAVRequest, Resource resource, String destination,
boolean overwrite, long depth)
throws WebDAVException {
try {
String[] destinationArray = WebDAVUtil.getPathArray(
destination, true);
long companyId = webDAVRequest.getCompanyId();
long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
try {
parentFolderId = getParentFolderId(companyId, destinationArray);
}
catch (NoSuchFolderException nsfe) {
if (_log.isDebugEnabled()) {
_log.debug(nsfe, nsfe);
}
return HttpServletResponse.SC_CONFLICT;
}
Folder folder = (Folder)resource.getModel();
long groupId = WebDAVUtil.getGroupId(companyId, destination);
String name = WebDAVUtil.getResourceName(destinationArray);
String description = folder.getDescription();
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(
isAddGroupPermissions(groupId));
serviceContext.setAddGuestPermissions(true);
int status = HttpServletResponse.SC_CREATED;
if (overwrite) {
if (deleteResource(
groupId, parentFolderId, name,
webDAVRequest.getLockUuid())) {
status = HttpServletResponse.SC_NO_CONTENT;
}
}
if (depth == 0) {
_dlAppService.addFolder(
groupId, parentFolderId, name, description, serviceContext);
}
else {
_dlAppService.copyFolder(
groupId, folder.getFolderId(), parentFolderId, name,
description, serviceContext);
}
return status;
}
catch (DuplicateFolderNameException dfne) {
if (_log.isDebugEnabled()) {
_log.debug(dfne, dfne);
}
return HttpServletResponse.SC_PRECONDITION_FAILED;
}
catch (PrincipalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return HttpServletResponse.SC_FORBIDDEN;
}
catch (Exception e) {
throw new WebDAVException(e);
}
}
@Override
public int copySimpleResource(
WebDAVRequest webDAVRequest, Resource resource, String destination,
boolean overwrite)
throws WebDAVException {
File file = null;
try {
String[] destinationArray = WebDAVUtil.getPathArray(
destination, true);
long companyId = webDAVRequest.getCompanyId();
long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
try {
parentFolderId = getParentFolderId(companyId, destinationArray);
}
catch (NoSuchFolderException nsfe) {
if (_log.isDebugEnabled()) {
_log.debug(nsfe, nsfe);
}
return HttpServletResponse.SC_CONFLICT;
}
FileEntry fileEntry = (FileEntry)resource.getModel();
long groupId = WebDAVUtil.getGroupId(companyId, destination);
String mimeType = fileEntry.getMimeType();
String title = getTitle(destinationArray);
String description = fileEntry.getDescription();
String changeLog = StringPool.BLANK;
InputStream is = fileEntry.getContentStream();
file = FileUtil.createTempFile(is);
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(
isAddGroupPermissions(groupId));
serviceContext.setAddGuestPermissions(true);
int status = HttpServletResponse.SC_CREATED;
if (overwrite) {
if (deleteResource(
groupId, parentFolderId, title,
webDAVRequest.getLockUuid())) {
status = HttpServletResponse.SC_NO_CONTENT;
}
}
_dlAppService.addFileEntry(
groupId, parentFolderId, title, mimeType, title, description,
changeLog, file, serviceContext);
return status;
}
catch (DuplicateFileEntryException dfee) {
if (_log.isDebugEnabled()) {
_log.debug(dfee, dfee);
}
return HttpServletResponse.SC_PRECONDITION_FAILED;
}
catch (DuplicateFolderNameException dfne) {
if (_log.isDebugEnabled()) {
_log.debug(dfne, dfne);
}
return HttpServletResponse.SC_PRECONDITION_FAILED;
}
catch (LockException le) {
if (_log.isDebugEnabled()) {
_log.debug(le, le);
}
return WebDAVUtil.SC_LOCKED;
}
catch (PrincipalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return HttpServletResponse.SC_FORBIDDEN;
}
catch (Exception e) {
throw new WebDAVException(e);
}
finally {
FileUtil.delete(file);
}
}
@Override
public int deleteResource(WebDAVRequest webDAVRequest)
throws WebDAVException {
try {
Resource resource = getResource(webDAVRequest);
if (resource == null) {
if (webDAVRequest.isAppleDoubleRequest()) {
return HttpServletResponse.SC_NO_CONTENT;
}
else {
return HttpServletResponse.SC_NOT_FOUND;
}
}
Object model = resource.getModel();
if (model instanceof Folder) {
Folder folder = (Folder)model;
long folderId = folder.getFolderId();
if ((folder.getModel() instanceof DLFolder) &&
_dlTrashUtil.isTrashEnabled(
folder.getGroupId(), folder.getRepositoryId())) {
_dlTrashService.moveFolderToTrash(folderId);
}
else {
_dlAppService.deleteFolder(folderId);
}
}
else {
FileEntry fileEntry = (FileEntry)model;
if (!hasLock(fileEntry, webDAVRequest.getLockUuid()) &&
(fileEntry.getLock() != null)) {
return WebDAVUtil.SC_LOCKED;
}
long fileEntryId = fileEntry.getFileEntryId();
if ((fileEntry.getModel() instanceof DLFileEntry) &&
_dlTrashUtil.isTrashEnabled(
fileEntry.getGroupId(), fileEntry.getRepositoryId())) {
_dlTrashService.moveFileEntryToTrash(fileEntryId);
}
else {
_dlAppService.deleteFileEntry(fileEntryId);
}
}
return HttpServletResponse.SC_NO_CONTENT;
}
catch (PrincipalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return HttpServletResponse.SC_FORBIDDEN;
}
catch (Exception e) {
throw new WebDAVException(e);
}
}
@Override
public Resource getResource(WebDAVRequest webDAVRequest)
throws WebDAVException {
try {
String[] pathArray = webDAVRequest.getPathArray();
long companyId = webDAVRequest.getCompanyId();
long parentFolderId = getParentFolderId(companyId, pathArray);
String name = WebDAVUtil.getResourceName(pathArray);
if (Validator.isNull(name)) {
String path = getRootPath() + webDAVRequest.getPath();
return new BaseResourceImpl(path, StringPool.BLANK, getToken());
}
try {
Folder folder = _dlAppService.getFolder(
webDAVRequest.getGroupId(), parentFolderId, name);
if ((folder.getParentFolderId() != parentFolderId) ||
(webDAVRequest.getGroupId() != folder.getRepositoryId())) {
StringBundler sb = new StringBundler(6);
sb.append("No DLFolder exists with the key ");
sb.append("{parendFolderId=");
sb.append(parentFolderId);
sb.append(", repositoryId=");
sb.append(webDAVRequest.getGroupId());
sb.append(StringPool.CLOSE_CURLY_BRACE);
throw new NoSuchFolderException(sb.toString());
}
return toResource(webDAVRequest, folder, false);
}
catch (NoSuchFolderException nsfe) {
if (_log.isDebugEnabled()) {
_log.debug(nsfe, nsfe);
}
try {
String title = getTitle(pathArray);
FileEntry fileEntry = _dlAppService.getFileEntry(
webDAVRequest.getGroupId(), parentFolderId, title);
return toResource(webDAVRequest, fileEntry, false);
}
catch (NoSuchFileEntryException nsfee) {
if (_log.isDebugEnabled()) {
_log.debug(nsfee, nsfee);
}
return null;
}
}
}
catch (Exception e) {
throw new WebDAVException(e);
}
}
@Override
public List<Resource> getResources(WebDAVRequest webDAVRequest)
throws WebDAVException {
try {
long folderId = getFolderId(
webDAVRequest.getCompanyId(), webDAVRequest.getPathArray());
List<Resource> folders = getFolders(webDAVRequest, folderId);
List<Resource> fileEntries = getFileEntries(
webDAVRequest, folderId);
List<Resource> resources = new ArrayList<>(
folders.size() + fileEntries.size());
resources.addAll(folders);
resources.addAll(fileEntries);
return resources;
}
catch (Exception e) {
throw new WebDAVException(e);
}
}
@Override
public boolean isSupportsClassTwo() {
return true;
}
@Override
public Status lockResource(
WebDAVRequest webDAVRequest, String owner, long timeout)
throws WebDAVException {
Resource resource = getResource(webDAVRequest);
Lock lock = null;
int status = HttpServletResponse.SC_OK;
try {
if (resource == null) {
status = HttpServletResponse.SC_CREATED;
HttpServletRequest request =
webDAVRequest.getHttpServletRequest();
String[] pathArray = webDAVRequest.getPathArray();
long companyId = webDAVRequest.getCompanyId();
long groupId = webDAVRequest.getGroupId();
long parentFolderId = getParentFolderId(companyId, pathArray);
String title = getTitle(pathArray);
String extension = FileUtil.getExtension(title);
String contentType = getContentType(
request, null, title, extension);
String description = StringPool.BLANK;
String changeLog = StringPool.BLANK;
File file = FileUtil.createTempFile(extension);
file.createNewFile();
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(
isAddGroupPermissions(groupId));
serviceContext.setAddGuestPermissions(true);
FileEntry fileEntry = _dlAppService.addFileEntry(
groupId, parentFolderId, title, contentType, title,
description, changeLog, file, serviceContext);
resource = toResource(webDAVRequest, fileEntry, false);
}
if (resource instanceof DLFileEntryResourceImpl) {
FileEntry fileEntry = (FileEntry)resource.getModel();
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAttribute(
DL.MANUAL_CHECK_IN_REQUIRED,
webDAVRequest.isManualCheckInRequired());
_dlAppService.checkOutFileEntry(
fileEntry.getFileEntryId(), owner, timeout, serviceContext);
lock = fileEntry.getLock();
}
else {
boolean inheritable = false;
long depth = WebDAVUtil.getDepth(
webDAVRequest.getHttpServletRequest());
if (depth != 0) {
inheritable = true;
}
Folder folder = (Folder)resource.getModel();
lock = _dlAppService.lockFolder(
folder.getRepositoryId(), folder.getFolderId(), owner,
inheritable, timeout);
}
}
catch (Exception e) {
// DuplicateLock is 423 not 501
if (!(e instanceof DuplicateLockException)) {
throw new WebDAVException(e);
}
status = WebDAVUtil.SC_LOCKED;
}
return new Status(lock, status);
}
@Override
public Status makeCollection(WebDAVRequest webDAVRequest)
throws WebDAVException {
try {
HttpServletRequest request = webDAVRequest.getHttpServletRequest();
if (request.getContentLength() > 0) {
return new Status(
HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
}
String[] pathArray = webDAVRequest.getPathArray();
long companyId = webDAVRequest.getCompanyId();
long groupId = webDAVRequest.getGroupId();
long parentFolderId = getParentFolderId(companyId, pathArray);
String name = WebDAVUtil.getResourceName(pathArray);
String description = StringPool.BLANK;
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(
isAddGroupPermissions(groupId));
serviceContext.setAddGuestPermissions(true);
_dlAppService.addFolder(
groupId, parentFolderId, name, description, serviceContext);
String location = StringUtil.merge(pathArray, StringPool.SLASH);
return new Status(location, HttpServletResponse.SC_CREATED);
}
catch (DuplicateFolderNameException dfne) {
if (_log.isDebugEnabled()) {
_log.debug(dfne, dfne);
}
return new Status(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
catch (DuplicateFileEntryException dfee) {
if (_log.isDebugEnabled()) {
_log.debug(dfee, dfee);
}
return new Status(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
catch (NoSuchFolderException nsfe) {
if (_log.isDebugEnabled()) {
_log.debug(nsfe, nsfe);
}
return new Status(HttpServletResponse.SC_CONFLICT);
}
catch (PrincipalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return new Status(HttpServletResponse.SC_FORBIDDEN);
}
catch (Exception e) {
throw new WebDAVException(e);
}
}
@Override
public int moveCollectionResource(
WebDAVRequest webDAVRequest, Resource resource, String destination,
boolean overwrite)
throws WebDAVException {
try {
String[] destinationArray = WebDAVUtil.getPathArray(
destination, true);
Folder folder = (Folder)resource.getModel();
long companyId = webDAVRequest.getCompanyId();
long groupId = WebDAVUtil.getGroupId(companyId, destinationArray);
long folderId = folder.getFolderId();
long parentFolderId = getParentFolderId(
companyId, destinationArray);
String name = WebDAVUtil.getResourceName(destinationArray);
String description = folder.getDescription();
ServiceContext serviceContext = new ServiceContext();
serviceContext.setUserId(webDAVRequest.getUserId());
int status = HttpServletResponse.SC_CREATED;
if (overwrite) {
if (deleteResource(
groupId, parentFolderId, name,
webDAVRequest.getLockUuid())) {
status = HttpServletResponse.SC_NO_CONTENT;
}
}
if (parentFolderId != folder.getParentFolderId()) {
_dlAppService.moveFolder(
folderId, parentFolderId, serviceContext);
}
if (!name.equals(folder.getName())) {
_dlAppService.updateFolder(
folderId, name, description, serviceContext);
}
return status;
}
catch (PrincipalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return HttpServletResponse.SC_FORBIDDEN;
}
catch (DuplicateFolderNameException dfne) {
if (_log.isDebugEnabled()) {
_log.debug(dfne, dfne);
}
return HttpServletResponse.SC_PRECONDITION_FAILED;
}
catch (Exception e) {
throw new WebDAVException(e);
}
}
@Override
public int moveSimpleResource(
WebDAVRequest webDAVRequest, Resource resource, String destination,
boolean overwrite)
throws WebDAVException {
File file = null;
try {
String[] destinationArray = WebDAVUtil.getPathArray(
destination, true);
FileEntry fileEntry = (FileEntry)resource.getModel();
if (!hasLock(fileEntry, webDAVRequest.getLockUuid()) &&
(fileEntry.getLock() != null)) {
return WebDAVUtil.SC_LOCKED;
}
long companyId = webDAVRequest.getCompanyId();
long groupId = WebDAVUtil.getGroupId(companyId, destinationArray);
long newParentFolderId = getParentFolderId(
companyId, destinationArray);
String title = getTitle(destinationArray);
String description = fileEntry.getDescription();
String changeLog = StringPool.BLANK;
ServiceContext serviceContext = new ServiceContext();
populateServiceContext(serviceContext, fileEntry);
int status = HttpServletResponse.SC_CREATED;
if (overwrite) {
if (deleteResource(
groupId, newParentFolderId, title,
webDAVRequest.getLockUuid())) {
status = HttpServletResponse.SC_NO_CONTENT;
}
}
// LPS-5415
if (webDAVRequest.isMac()) {
try {
FileEntry destFileEntry = _dlAppService.getFileEntry(
groupId, newParentFolderId, title);
InputStream is = fileEntry.getContentStream();
file = FileUtil.createTempFile(is);
_dlAppService.updateFileEntry(
destFileEntry.getFileEntryId(),
destFileEntry.getTitle(), destFileEntry.getMimeType(),
destFileEntry.getTitle(),
destFileEntry.getDescription(), changeLog, false, file,
serviceContext);
_dlAppService.deleteFileEntry(fileEntry.getFileEntryId());
return status;
}
catch (NoSuchFileEntryException nsfee) {
if (_log.isDebugEnabled()) {
_log.debug(nsfee, nsfee);
}
}
}
_dlAppService.updateFileEntry(
fileEntry.getFileEntryId(), title, fileEntry.getMimeType(),
title, description, changeLog, false, file, serviceContext);
if (fileEntry.getFolderId() != newParentFolderId) {
fileEntry = _dlAppService.moveFileEntry(
fileEntry.getFileEntryId(), newParentFolderId,
serviceContext);
}
return status;
}
catch (PrincipalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return HttpServletResponse.SC_FORBIDDEN;
}
catch (DuplicateFileEntryException dfee) {
if (_log.isDebugEnabled()) {
_log.debug(dfee, dfee);
}
return HttpServletResponse.SC_PRECONDITION_FAILED;
}
catch (DuplicateFolderNameException dfne) {
if (_log.isDebugEnabled()) {
_log.debug(dfne, dfne);
}
return HttpServletResponse.SC_PRECONDITION_FAILED;
}
catch (LockException le) {
if (_log.isDebugEnabled()) {
_log.debug(le, le);
}
return WebDAVUtil.SC_LOCKED;
}
catch (Exception e) {
throw new WebDAVException(e);
}
finally {
FileUtil.delete(file);
}
}
@Override
public int putResource(WebDAVRequest webDAVRequest) throws WebDAVException {
File file = null;
try {
HttpServletRequest request = webDAVRequest.getHttpServletRequest();
String[] pathArray = webDAVRequest.getPathArray();
long companyId = webDAVRequest.getCompanyId();
long groupId = webDAVRequest.getGroupId();
long parentFolderId = getParentFolderId(companyId, pathArray);
String title = getTitle(pathArray);
String description = StringPool.BLANK;
String changeLog = StringPool.BLANK;
ServiceContext serviceContext = ServiceContextFactory.getInstance(
request);
serviceContext.setAddGroupPermissions(
isAddGroupPermissions(groupId));
serviceContext.setAddGuestPermissions(true);
String extension = FileUtil.getExtension(title);
file = FileUtil.createTempFile(extension);
FileUtil.write(file, request.getInputStream());
String contentType = getContentType(
request, file, title, extension);
try {
FileEntry fileEntry = _dlAppService.getFileEntry(
groupId, parentFolderId, title);
if (!hasLock(fileEntry, webDAVRequest.getLockUuid()) &&
(fileEntry.getLock() != null)) {
return WebDAVUtil.SC_LOCKED;
}
long fileEntryId = fileEntry.getFileEntryId();
description = fileEntry.getDescription();
populateServiceContext(serviceContext, fileEntry);
serviceContext.setCommand(Constants.UPDATE_WEBDAV);
_dlAppService.updateFileEntry(
fileEntryId, title, contentType, title, description,
changeLog, false, file, serviceContext);
}
catch (NoSuchFileEntryException nsfee) {
if (_log.isDebugEnabled()) {
_log.debug(nsfee, nsfee);
}
serviceContext.setCommand(Constants.ADD_WEBDAV);
_dlAppService.addFileEntry(
groupId, parentFolderId, title, contentType, title,
description, changeLog, file, serviceContext);
}
if (_log.isInfoEnabled()) {
_log.info(
"Added " + StringUtil.merge(pathArray, StringPool.SLASH));
}
return HttpServletResponse.SC_CREATED;
}
catch (FileSizeException fse) {
if (_log.isDebugEnabled()) {
_log.debug(fse, fse);
}
return HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE;
}
catch (NoSuchFolderException nsfe) {
if (_log.isDebugEnabled()) {
_log.debug(nsfe, nsfe);
}
return HttpServletResponse.SC_CONFLICT;
}
catch (PrincipalException pe) {
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return HttpServletResponse.SC_FORBIDDEN;
}
catch (PortalException pe) {
if (_log.isWarnEnabled()) {
_log.warn(pe, pe);
}
return HttpServletResponse.SC_CONFLICT;
}
catch (Exception e) {
throw new WebDAVException(e);
}
finally {
FileUtil.delete(file);
}
}
@Override
public Lock refreshResourceLock(
WebDAVRequest webDAVRequest, String uuid, long timeout)
throws WebDAVException {
Resource resource = getResource(webDAVRequest);
long companyId = webDAVRequest.getCompanyId();
Lock lock = null;
try {
if (resource instanceof DLFileEntryResourceImpl) {
lock = _dlAppService.refreshFileEntryLock(
uuid, companyId, timeout);
}
else {
lock = _dlAppService.refreshFolderLock(
uuid, companyId, timeout);
}
}
catch (Exception e) {
throw new WebDAVException(e);
}
return lock;
}
@Override
public boolean unlockResource(WebDAVRequest webDAVRequest, String token)
throws WebDAVException {
Resource resource = getResource(webDAVRequest);
try {
if (resource instanceof DLFileEntryResourceImpl) {
FileEntry fileEntry = (FileEntry)resource.getModel();
// Do not allow WebDAV to check in a file entry if it requires a
// manual check in
if (fileEntry.isManualCheckInRequired()) {
return false;
}
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAttribute(
DL.WEBDAV_CHECK_IN_MODE, Boolean.TRUE);
_dlAppService.checkInFileEntry(
fileEntry.getFileEntryId(), token, serviceContext);
if (webDAVRequest.isAppleDoubleRequest()) {
_dlAppService.deleteFileEntry(fileEntry.getFileEntryId());
}
}
else {
Folder folder = (Folder)resource.getModel();
_dlAppService.unlockFolder(
folder.getRepositoryId(), folder.getParentFolderId(),
folder.getName(), token);
}
return true;
}
catch (InvalidLockException ile) {
if (_log.isWarnEnabled()) {
_log.warn(ile.getMessage());
}
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn("Unable to unlock file entry", e);
}
}
return false;
}
protected boolean deleteResource(
long groupId, long parentFolderId, String name, String lockUuid)
throws Exception {
try {
Folder folder = _dlAppService.getFolder(
groupId, parentFolderId, name);
_dlAppService.deleteFolder(folder.getFolderId());
return true;
}
catch (NoSuchFolderException nsfe) {
if (_log.isDebugEnabled()) {
_log.debug(nsfe, nsfe);
}
try {
FileEntry fileEntry = _dlAppService.getFileEntry(
groupId, parentFolderId, name);
if (!hasLock(fileEntry, lockUuid) &&
(fileEntry.getLock() != null)) {
StringBundler sb = new StringBundler(4);
sb.append("Inconsistent file lock state for file entry ");
sb.append(fileEntry.getPrimaryKey());
sb.append(" and lock UUID ");
sb.append(lockUuid);
throw new LockException(sb.toString());
}
_dlAppService.deleteFileEntryByTitle(
groupId, parentFolderId, name);
return true;
}
catch (NoSuchFileEntryException nsfee) {
if (_log.isDebugEnabled()) {
_log.debug(nsfee, nsfee);
}
}
}
return false;
}
protected String getContentType(
HttpServletRequest request, File file, String title, String extension) {
String contentType = GetterUtil.getString(
request.getHeader(HttpHeaders.CONTENT_TYPE),
ContentTypes.APPLICATION_OCTET_STREAM);
if (contentType.equals(ContentTypes.APPLICATION_OCTET_STREAM) ||
contentType.equals(MS_OFFICE_2010_TEXT_XML_UTF8)) {
contentType = MimeTypesUtil.getContentType(file, title);
}
return contentType;
}
protected List<Resource> getFileEntries(
WebDAVRequest webDAVRequest, long parentFolderId)
throws Exception {
List<Resource> resources = new ArrayList<>();
List<FileEntry> fileEntries = _dlAppService.getFileEntries(
webDAVRequest.getGroupId(), parentFolderId);
for (FileEntry fileEntry : fileEntries) {
if (!DLWebDAVUtil.isRepresentableTitle(fileEntry.getTitle())) {
_log.error(
"Unrepresentable WebDAV title for file name " +
fileEntry.getTitle());
continue;
}
Resource resource = toResource(webDAVRequest, fileEntry, true);
resources.add(resource);
}
return resources;
}
protected long getFolderId(long companyId, String[] pathArray)
throws Exception {
return getFolderId(companyId, pathArray, false);
}
protected long getFolderId(
long companyId, String[] pathArray, boolean parent)
throws Exception {
long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
if (pathArray.length <= 1) {
return folderId;
}
long groupId = WebDAVUtil.getGroupId(companyId, pathArray);
int x = pathArray.length;
if (parent) {
x--;
}
for (int i = 2; i < x; i++) {
String name = pathArray[i];
Folder folder = _dlAppService.getFolder(groupId, folderId, name);
if (groupId == folder.getRepositoryId()) {
folderId = folder.getFolderId();
}
}
return folderId;
}
protected List<Resource> getFolders(
WebDAVRequest webDAVRequest, long parentFolderId)
throws Exception {
List<Resource> resources = new ArrayList<>();
long groupId = webDAVRequest.getGroupId();
List<Folder> folders = _dlAppService.getFolders(
groupId, parentFolderId, false);
for (Folder folder : folders) {
Resource resource = toResource(webDAVRequest, folder, true);
resources.add(resource);
}
return resources;
}
protected long getParentFolderId(long companyId, String[] pathArray)
throws Exception {
return getFolderId(companyId, pathArray, true);
}
protected String getTitle(String[] pathArray) {
return DLWebDAVUtil.unescapeRawTitle(
WebDAVUtil.getResourceName(pathArray));
}
protected boolean hasLock(FileEntry fileEntry, String lockUuid)
throws Exception {
if (Validator.isNull(lockUuid)) {
// Client does not claim to know of a lock
return fileEntry.hasLock();
}
else {
// Client claims to know of a lock. Verify the lock UUID.
try {
return _dlAppService.verifyFileEntryLock(
fileEntry.getRepositoryId(), fileEntry.getFileEntryId(),
lockUuid);
}
catch (NoSuchLockException nsle) {
if (_log.isDebugEnabled()) {
_log.debug(nsle, nsle);
}
return false;
}
}
}
protected void populateServiceContext(
ServiceContext serviceContext, FileEntry fileEntry) {
serviceContext.setScopeGroupId(fileEntry.getGroupId());
String className = DLFileEntryConstants.getClassName();
long[] assetCategoryIds = _assetCategoryLocalService.getCategoryIds(
className, fileEntry.getFileEntryId());
serviceContext.setAssetCategoryIds(assetCategoryIds);
AssetEntry assetEntry = _assetEntryLocalService.fetchEntry(
className, fileEntry.getFileEntryId());
List<AssetLink> assetLinks = _assetLinkLocalService.getLinks(
assetEntry.getEntryId());
long[] assetLinkEntryIds = ListUtil.toLongArray(
assetLinks, AssetLink.ENTRY_ID2_ACCESSOR);
serviceContext.setAssetLinkEntryIds(assetLinkEntryIds);
String[] assetTagNames = _assetTagLocalService.getTagNames(
className, fileEntry.getFileEntryId());
serviceContext.setAssetTagNames(assetTagNames);
ExpandoBridge expandoBridge = fileEntry.getExpandoBridge();
serviceContext.setExpandoBridgeAttributes(
expandoBridge.getAttributes());
}
@Reference(unbind = "-")
protected void setAssetCategoryLocalService(
AssetCategoryLocalService assetCategoryLocalService) {
_assetCategoryLocalService = assetCategoryLocalService;
}
@Reference(unbind = "-")
protected void setAssetEntryLocalService(
AssetEntryLocalService assetEntryLocalService) {
_assetEntryLocalService = assetEntryLocalService;
}
@Reference(unbind = "-")
protected void setAssetLinkLocalService(
AssetLinkLocalService assetLinkLocalService) {
_assetLinkLocalService = assetLinkLocalService;
}
@Reference(unbind = "-")
protected void setAssetTagLocalService(
AssetTagLocalService assetTagLocalService) {
_assetTagLocalService = assetTagLocalService;
}
@Reference(unbind = "-")
protected void setDLAppService(DLAppService dlAppService) {
_dlAppService = dlAppService;
}
@Reference(unbind = "-")
protected void setDLTrashService(DLTrashService dlTrashService) {
_dlTrashService = dlTrashService;
}
protected Resource toResource(
WebDAVRequest webDAVRequest, FileEntry fileEntry, boolean appendPath) {
return new DLFileEntryResourceImpl(
webDAVRequest, fileEntry, appendPath);
}
protected Resource toResource(
WebDAVRequest webDAVRequest, Folder folder, boolean appendPath) {
String parentPath = getRootPath() + webDAVRequest.getPath();
String name = StringPool.BLANK;
if (appendPath) {
name = folder.getName();
}
Resource resource = new BaseResourceImpl(
parentPath, name, folder.getName(), folder.getCreateDate(),
folder.getModifiedDate());
resource.setModel(folder);
resource.setClassName(Folder.class.getName());
resource.setPrimaryKey(folder.getPrimaryKey());
return resource;
}
private static final Log _log = LogFactoryUtil.getLog(
DLWebDAVStorageImpl.class);
private AssetCategoryLocalService _assetCategoryLocalService;
private AssetEntryLocalService _assetEntryLocalService;
private AssetLinkLocalService _assetLinkLocalService;
private AssetTagLocalService _assetTagLocalService;
private DLAppService _dlAppService;
private DLTrashService _dlTrashService;
@Reference
private DLTrashUtil _dlTrashUtil;
}