--- /dev/null
+/**\r
+ * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to deal\r
+ * in the Software without restriction, including without limitation the rights\r
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+ * copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ */\r
+\r
+package com.liferay.portlet.documentlibrary.webdav;\r
+\r
+import java.io.File;\r
+import java.io.InputStream;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import com.liferay.portal.DuplicateLockException;\r
+import com.liferay.portal.InvalidLockException;\r
+import com.liferay.portal.NoSuchLockException;\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.repository.model.FileEntry;\r
+import com.liferay.portal.kernel.repository.model.Folder;\r
+import com.liferay.portal.kernel.search.Indexer;\r
+import com.liferay.portal.kernel.search.IndexerRegistryUtil;\r
+import com.liferay.portal.kernel.servlet.HttpHeaders;\r
+import com.liferay.portal.kernel.util.ContentTypes;\r
+import com.liferay.portal.kernel.util.FileUtil;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.MimeTypesUtil;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.webdav.BaseResourceImpl;\r
+import com.liferay.portal.kernel.webdav.BaseWebDAVStorageImpl;\r
+import com.liferay.portal.kernel.webdav.Resource;\r
+import com.liferay.portal.kernel.webdav.Status;\r
+import com.liferay.portal.kernel.webdav.WebDAVException;\r
+import com.liferay.portal.kernel.webdav.WebDAVRequest;\r
+import com.liferay.portal.kernel.webdav.WebDAVUtil;\r
+import com.liferay.portal.kernel.workflow.WorkflowConstants;\r
+import com.liferay.portal.model.Lock;\r
+import com.liferay.portal.security.auth.PrincipalException;\r
+import com.liferay.portal.service.ServiceContext;\r
+import com.liferay.portal.service.ServiceContextFactory;\r
+import com.liferay.portal.webdav.LockException;\r
+import com.liferay.portlet.asset.service.AssetTagLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.DuplicateFileException;\r
+import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;\r
+import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;\r
+import com.liferay.portlet.documentlibrary.NoSuchFolderException;\r
+import com.liferay.portlet.documentlibrary.model.DLFileEntry;\r
+import com.liferay.portlet.documentlibrary.model.DLFileEntryConstants;\r
+import com.liferay.portlet.documentlibrary.model.DLFolder;\r
+import com.liferay.portlet.documentlibrary.model.DLFolderConstants;\r
+import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;\r
+import com.pentila.entSavoie.utils.DLAppUtil;\r
+import com.pentila.entSavoie.utils.PermissionsUtils;\r
+\r
+/**\r
+ * <a href="DLWebDAVStorageImpl.java.html"><b><i>View Source</i></b></a>\r
+ *\r
+ * @author Brian Wing Shun Chan\r
+ * @author Alexander Chow\r
+ *\r
+ */\r
+public class DLWebDAVStorageImpl extends BaseWebDAVStorageImpl {\r
+\r
+ @Override\r
+ public int copyCollectionResource(\r
+ WebDAVRequest webDavRequest, Resource resource, String destination,\r
+ boolean overwrite, long depth)\r
+ throws WebDAVException {\r
+\r
+ try {\r
+ String[] destinationArray = WebDAVUtil.getPathArray(\r
+ destination, true);\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+\r
+ long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;\r
+\r
+ try {\r
+ parentFolderId = getParentFolderId(companyId, destinationArray);\r
+ }\r
+ catch (NoSuchFolderException nsfe) {\r
+ return HttpServletResponse.SC_CONFLICT;\r
+ }\r
+\r
+ Folder parentFolder = DLAppLocalServiceUtil.getFolder(parentFolderId);\r
+\r
+ Folder folder = (Folder)resource.getModel();\r
+\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), parentFolder, "ADD_OBJECT")) {\r
+ long groupId = WebDAVUtil.getGroupId(companyId, destination);\r
+ String name = WebDAVUtil.getResourceName(destinationArray);\r
+ String description = folder.getDescription();\r
+ \r
+ ServiceContext serviceContext = new ServiceContext();\r
+ \r
+ serviceContext.setAddGroupPermissions(\r
+ isAddGroupPermissions(groupId));\r
+ serviceContext.setAddGuestPermissions(true);\r
+ serviceContext.setAddGuestPermissions(true);\r
+ \r
+ int status = HttpServletResponse.SC_CREATED;\r
+ \r
+ if (overwrite) {\r
+ if (deleteResource(\r
+ groupId, parentFolderId, name,\r
+ webDavRequest.getLockUuid())) {\r
+\r
+ status = HttpServletResponse.SC_NO_CONTENT;\r
+ }\r
+ }\r
+\r
+ if (depth == 0) {\r
+ \r
+ Folder newFolder = DLAppServiceUtil.addFolder(\r
+ groupId, parentFolderId, name, description, serviceContext);\r
+ \r
+ // Apply parent folder permissions\r
+ PermissionsUtils.setParentPermissionToFolder(newFolder);\r
+ \r
+ // Reindex\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(DLFolder.class);\r
+ indexer.reindex(newFolder);\r
+ }\r
+ else {\r
+ \r
+ Folder copiedFolder = DLAppServiceUtil.copyFolder(\r
+ groupId, folder.getFolderId(), parentFolderId, name,\r
+ description, serviceContext);\r
+\r
+ // Apply parent folder permissions\r
+ PermissionsUtils.setParentPermissionToFolder(copiedFolder);\r
+ \r
+ // Reindex\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(DLFolder.class);\r
+ indexer.reindex(copiedFolder);\r
+ }\r
+ return status;\r
+ } else {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ }\r
+ catch (DuplicateFolderNameException dfne) {\r
+ return HttpServletResponse.SC_PRECONDITION_FAILED;\r
+ }\r
+ catch (PrincipalException pe) {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e);\r
+ throw new WebDAVException(e);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int copySimpleResource(\r
+ WebDAVRequest webDavRequest, Resource resource, String destination,\r
+ boolean overwrite)\r
+ throws WebDAVException {\r
+\r
+ File file = null;\r
+\r
+ try {\r
+ String[] destinationArray = WebDAVUtil.getPathArray(\r
+ destination, true);\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+\r
+ long parentFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;\r
+\r
+ try {\r
+ parentFolderId = getParentFolderId(companyId, destinationArray);\r
+ }\r
+ catch (NoSuchFolderException nsfe) {\r
+ return HttpServletResponse.SC_CONFLICT;\r
+ }\r
+\r
+ Folder parentFolder = DLAppLocalServiceUtil.getFolder(parentFolderId);\r
+\r
+ FileEntry fileEntry = (FileEntry)resource.getModel();\r
+\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), parentFolder, "ADD_OBJECT")) {\r
+\r
+ long groupId = WebDAVUtil.getGroupId(companyId, destination);\r
+ String mimeType = fileEntry.getMimeType();\r
+ String title = WebDAVUtil.getResourceName(destinationArray);\r
+ String description = fileEntry.getDescription();\r
+ String changeLog = StringPool.BLANK;\r
+\r
+ InputStream is = fileEntry.getContentStream();\r
+\r
+ file = FileUtil.createTempFile(is);\r
+\r
+ ServiceContext serviceContext = new ServiceContext();\r
+\r
+ serviceContext.setAddGroupPermissions(\r
+ isAddGroupPermissions(groupId));\r
+ serviceContext.setAddGuestPermissions(true);\r
+\r
+ int status = HttpServletResponse.SC_CREATED;\r
+ \r
+ if (overwrite) {\r
+ if (deleteResource(\r
+ groupId, parentFolderId, title,\r
+ webDavRequest.getLockUuid())) {\r
+\r
+ status = HttpServletResponse.SC_NO_CONTENT;\r
+ }\r
+ }\r
+\r
+ FileEntry newFileEntry = DLAppServiceUtil.addFileEntry(\r
+ groupId, parentFolderId, title, mimeType, title, description,\r
+ changeLog, file, serviceContext);\r
+\r
+ // Apply parent folder permissions\r
+ PermissionsUtils.setParentPermissionToFile(newFileEntry);\r
+ \r
+ // Reindex\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(DLFileEntry.class);\r
+ indexer.reindex(newFileEntry);\r
+\r
+ return status;\r
+ } else {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ }\r
+ catch (DuplicateFileException dfe) {\r
+ return HttpServletResponse.SC_PRECONDITION_FAILED;\r
+ }\r
+ catch (DuplicateFolderNameException dfne) {\r
+ return HttpServletResponse.SC_PRECONDITION_FAILED;\r
+ }\r
+ catch (LockException le) {\r
+ return WebDAVUtil.SC_LOCKED;\r
+ }\r
+ catch (PrincipalException pe) {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e);\r
+ throw new WebDAVException(e);\r
+ }\r
+ finally {\r
+ FileUtil.delete(file);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int deleteResource(WebDAVRequest webDavRequest)\r
+ throws WebDAVException {\r
+ try {\r
+ Resource resource = getResource(webDavRequest);\r
+\r
+ if (resource == null) {\r
+ if (webDavRequest.isAppleDoubleRequest()) {\r
+ return HttpServletResponse.SC_NO_CONTENT;\r
+ }\r
+ else {\r
+ return HttpServletResponse.SC_NOT_FOUND;\r
+ }\r
+ }\r
+\r
+ Object model = resource.getModel();\r
+\r
+ if (model instanceof Folder) {\r
+ Folder folder = (Folder)model;\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), folder, "DELETE")) {\r
+ DLAppServiceUtil.deleteFolder(folder.getFolderId());\r
+ } else {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ }\r
+ else {\r
+ FileEntry fileEntry = (FileEntry)model;\r
+\r
+ if (!hasLock(fileEntry, webDavRequest.getLockUuid()) &&\r
+ (fileEntry.getLock() != null)) {\r
+ return WebDAVUtil.SC_LOCKED;\r
+ }\r
+\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), fileEntry, "DELETE")) {\r
+ DLAppServiceUtil.deleteFileEntry(fileEntry.getFileEntryId());\r
+ } else {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ }\r
+\r
+ return HttpServletResponse.SC_NO_CONTENT;\r
+ }\r
+ catch (PrincipalException pe) {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e);\r
+ throw new WebDAVException(e);\r
+ }\r
+ }\r
+\r
+ public Resource getResource(WebDAVRequest webDavRequest)\r
+ throws WebDAVException {\r
+\r
+ try {\r
+ String[] pathArray = webDavRequest.getPathArray();\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+ long parentFolderId = getParentFolderId(companyId, pathArray);\r
+ String name = WebDAVUtil.getResourceName(pathArray);\r
+\r
+ if (Validator.isNull(name)) {\r
+ String path = getRootPath() + webDavRequest.getPath();\r
+\r
+ return new BaseResourceImpl(path, StringPool.BLANK, getToken());\r
+ }\r
+\r
+ try {\r
+ Folder folder = DLAppServiceUtil.getFolder(\r
+ webDavRequest.getGroupId(), parentFolderId, name);\r
+ \r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), folder, "VIEW")) {\r
+\r
+ if ((folder.getParentFolderId() != parentFolderId) ||\r
+ (webDavRequest.getGroupId() != folder.getRepositoryId())) {\r
+\r
+ throw new NoSuchFolderException();\r
+ }\r
+\r
+ return toResource(webDavRequest, folder, false);\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ catch (NoSuchFolderException nsfe) {\r
+ try {\r
+ String titleWithExtension = name;\r
+\r
+ FileEntry fileEntry = DLAppServiceUtil.getFileEntry(\r
+ webDavRequest.getGroupId(), parentFolderId,\r
+ titleWithExtension);\r
+ \r
+ // Si le file a une taille nulle, on la recalcule\r
+ if(fileEntry.getSize() == 0){\r
+ InputStream is = fileEntry.getContentStream();\r
+ byte[] bytes = FileUtil.getBytes(is);\r
+ DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntry.getFileEntryId());\r
+ dlFileEntry.setSize(bytes.length);\r
+ DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry, false);\r
+ }\r
+ \r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), fileEntry, "VIEW")) {\r
+ return toResource(webDavRequest, fileEntry, false);\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ catch (NoSuchFileEntryException nsfee) {\r
+ return null;\r
+ }\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ throw new WebDAVException(e);\r
+ }\r
+ }\r
+\r
+ public List<Resource> getResources(WebDAVRequest webDavRequest)\r
+ throws WebDAVException {\r
+\r
+ try {\r
+ long folderId = getFolderId(\r
+ webDavRequest.getCompanyId(), webDavRequest.getPathArray());\r
+\r
+ List<Resource> folders = getFolders(webDavRequest, folderId);\r
+ List<Resource> fileEntries = getFileEntries(\r
+ webDavRequest, folderId);\r
+\r
+ List<Resource> resources = new ArrayList<Resource>(\r
+ folders.size() + fileEntries.size());\r
+\r
+ resources.addAll(folders);\r
+ resources.addAll(fileEntries);\r
+\r
+ return resources;\r
+ }\r
+ catch (Exception e) {\r
+ throw new WebDAVException(e);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public boolean isSupportsClassTwo() {\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public Status lockResource(\r
+ WebDAVRequest webDavRequest, String owner, long timeout)\r
+ throws WebDAVException {\r
+\r
+ Resource resource = getResource(webDavRequest);\r
+\r
+ Lock lock = null;\r
+ int status = HttpServletResponse.SC_OK;\r
+\r
+ try {\r
+ if (resource == null) {\r
+ status = HttpServletResponse.SC_CREATED;\r
+\r
+ HttpServletRequest request =\r
+ webDavRequest.getHttpServletRequest();\r
+\r
+ String[] pathArray = webDavRequest.getPathArray();\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+ long groupId = webDavRequest.getGroupId();\r
+ long parentFolderId = getParentFolderId(companyId, pathArray);\r
+ String title = WebDAVUtil.getResourceName(pathArray);\r
+\r
+ String contentType = GetterUtil.get(\r
+ request.getHeader(HttpHeaders.CONTENT_TYPE),\r
+ ContentTypes.APPLICATION_OCTET_STREAM);\r
+\r
+ if (contentType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {\r
+ contentType = MimeTypesUtil.getContentType(\r
+ request.getInputStream(), title);\r
+ }\r
+\r
+ String description = StringPool.BLANK;\r
+ String changeLog = StringPool.BLANK;\r
+\r
+ File file = FileUtil.createTempFile(\r
+ FileUtil.getExtension(title));\r
+\r
+ file.createNewFile();\r
+\r
+ ServiceContext serviceContext = new ServiceContext();\r
+\r
+ serviceContext.setAddGroupPermissions(\r
+ isAddGroupPermissions(groupId));\r
+ serviceContext.setAddGuestPermissions(true);\r
+\r
+ FileEntry fileEntry = DLAppServiceUtil.addFileEntry(\r
+ groupId, parentFolderId, title, contentType, title,\r
+ description, changeLog, file, serviceContext);\r
+\r
+ // Apply parent folder permissions\r
+ PermissionsUtils.setParentPermissionToFile(fileEntry);\r
+ \r
+ // Reindex\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(DLFileEntry.class);\r
+ indexer.reindex(fileEntry);\r
+\r
+ resource = toResource(webDavRequest, fileEntry, false);\r
+ }\r
+\r
+ if (resource instanceof DLFileEntryResourceImpl) {\r
+ FileEntry fileEntry = (FileEntry)resource.getModel();\r
+\r
+ DLAppServiceUtil.checkOutFileEntry(\r
+ fileEntry.getFileEntryId(), owner, timeout,\r
+ new ServiceContext());\r
+\r
+ lock = fileEntry.getLock();\r
+ }\r
+ else {\r
+ boolean inheritable = false;\r
+\r
+ long depth = WebDAVUtil.getDepth(\r
+ webDavRequest.getHttpServletRequest());\r
+\r
+ if (depth != 0) {\r
+ inheritable = true;\r
+ }\r
+\r
+ Folder folder = (Folder)resource.getModel();\r
+\r
+ lock = DLAppServiceUtil.lockFolder(\r
+ folder.getRepositoryId(), folder.getFolderId(), owner,\r
+ inheritable, timeout);\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+\r
+ // DuplicateLock is 423 not 501\r
+\r
+ if (!(e instanceof DuplicateLockException)) {\r
+ throw new WebDAVException(e);\r
+ }\r
+\r
+ status = WebDAVUtil.SC_LOCKED;\r
+ }\r
+\r
+ resource.setLock(lock);\r
+ \r
+ return new Status(lock, status);\r
+ }\r
+\r
+ @Override\r
+ public Status makeCollection(WebDAVRequest webDavRequest)\r
+ throws WebDAVException {\r
+\r
+ try {\r
+ HttpServletRequest request = webDavRequest.getHttpServletRequest();\r
+\r
+ if (request.getContentLength() > 0) {\r
+ return new Status(\r
+ HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);\r
+ }\r
+\r
+ String[] pathArray = webDavRequest.getPathArray();\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+ long groupId = webDavRequest.getGroupId();\r
+ long parentFolderId = getParentFolderId(companyId, pathArray);\r
+ String name = WebDAVUtil.getResourceName(pathArray);\r
+ String description = StringPool.BLANK;\r
+\r
+ ServiceContext serviceContext = new ServiceContext();\r
+\r
+ serviceContext.setAddGroupPermissions(\r
+ isAddGroupPermissions(groupId));\r
+ serviceContext.setAddGuestPermissions(true);\r
+\r
+ Folder folder = DLAppServiceUtil.addFolder(\r
+ groupId, parentFolderId, name, description, serviceContext);\r
+\r
+ // Apply parent folder permissions to the created folder\r
+ PermissionsUtils.setParentPermissionToFolder(folder);\r
+ \r
+ // Reindex\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(DLFolder.class);\r
+ indexer.reindex(folder);\r
+ \r
+ String location = StringUtil.merge(pathArray, StringPool.SLASH);\r
+\r
+ return new Status(location, HttpServletResponse.SC_CREATED);\r
+ }\r
+ catch (DuplicateFolderNameException dfne) {\r
+ return new Status(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
+ }\r
+ catch (DuplicateFileException dfe) {\r
+ return new Status(HttpServletResponse.SC_METHOD_NOT_ALLOWED);\r
+ }\r
+ catch (NoSuchFolderException nsfe) {\r
+ return new Status(HttpServletResponse.SC_CONFLICT);\r
+ }\r
+ catch (PrincipalException pe) {\r
+ return new Status(HttpServletResponse.SC_FORBIDDEN);\r
+ }\r
+ catch (Exception e) {\r
+ throw new WebDAVException(e);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int moveCollectionResource(\r
+ WebDAVRequest webDavRequest, Resource resource, String destination,\r
+ boolean overwrite)\r
+ throws WebDAVException {\r
+\r
+ try {\r
+ String[] destinationArray = WebDAVUtil.getPathArray(\r
+ destination, true);\r
+\r
+ Folder folder = (Folder)resource.getModel();\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+ long groupId = WebDAVUtil.getGroupId(companyId, destinationArray);\r
+ long folderId = folder.getFolderId();\r
+ long parentFolderId = getParentFolderId(\r
+ companyId, destinationArray);\r
+\r
+ Folder parentFolder = DLAppLocalServiceUtil.getFolder(parentFolderId);\r
+\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), parentFolder, "ADD_OBJECT")) {\r
+\r
+ String name = WebDAVUtil.getResourceName(destinationArray);\r
+ String description = folder.getDescription();\r
+ \r
+ ServiceContext serviceContext = new ServiceContext();\r
+\r
+ int status = HttpServletResponse.SC_CREATED;\r
+\r
+ if (overwrite) {\r
+ if (deleteResource(\r
+ groupId, parentFolderId, name,\r
+ webDavRequest.getLockUuid())) {\r
+\r
+ status = HttpServletResponse.SC_NO_CONTENT;\r
+ }\r
+ }\r
+ \r
+ if (parentFolderId != folder.getParentFolderId()) {\r
+ DLAppServiceUtil.moveFolder(\r
+ folderId, parentFolderId, serviceContext);\r
+ }\r
+\r
+ if (!name.equals(folder.getName())) {\r
+ folder = DLAppServiceUtil.updateFolder(\r
+ folderId, name, description, serviceContext);\r
+ }\r
+ \r
+ // Apply new parent folder permissions to the moved folder\r
+ PermissionsUtils.setParentPermissionToFolder(folder);\r
+\r
+ // Reindex\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(DLFolder.class);\r
+ indexer.reindex(folder);\r
+ \r
+ return status;\r
+ \r
+ } else {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ }\r
+ catch (PrincipalException pe) {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ catch (DuplicateFolderNameException dfne) {\r
+ return HttpServletResponse.SC_PRECONDITION_FAILED;\r
+ }\r
+ catch (Exception e) {\r
+ throw new WebDAVException(e);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int moveSimpleResource(\r
+ WebDAVRequest webDavRequest, Resource resource, String destination,\r
+ boolean overwrite)\r
+ throws WebDAVException {\r
+\r
+ File file = null;\r
+\r
+ try {\r
+ String[] destinationArray = WebDAVUtil.getPathArray(\r
+ destination, true);\r
+\r
+ FileEntry fileEntry = (FileEntry)resource.getModel();\r
+\r
+ if (!hasLock(fileEntry, webDavRequest.getLockUuid()) &&\r
+ (fileEntry.getLock() != null)) {\r
+\r
+ return WebDAVUtil.SC_LOCKED;\r
+ }\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+ long groupId = WebDAVUtil.getGroupId(companyId, destinationArray);\r
+ long newParentFolderId = getParentFolderId(\r
+ companyId, destinationArray);\r
+ \r
+ Folder parentFolder = DLAppLocalServiceUtil.getFolder(newParentFolderId);\r
+ \r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), parentFolder, "ADD_OBJECT")) {\r
+\r
+ String sourceFileName = WebDAVUtil.getResourceName(\r
+ destinationArray);\r
+ String title = WebDAVUtil.getResourceName(destinationArray);\r
+ String description = fileEntry.getDescription();\r
+ String changeLog = StringPool.BLANK;\r
+\r
+ String[] assetTagNames = AssetTagLocalServiceUtil.getTagNames(\r
+ DLFileEntryConstants.getClassName(),\r
+ fileEntry.getFileEntryId());\r
+\r
+ ServiceContext serviceContext = new ServiceContext();\r
+\r
+ serviceContext.setAssetTagNames(assetTagNames);\r
+\r
+ int status = HttpServletResponse.SC_CREATED;\r
+\r
+ if (overwrite) {\r
+ if (deleteResource(\r
+ groupId, newParentFolderId, title,\r
+ webDavRequest.getLockUuid())) {\r
+\r
+ status = HttpServletResponse.SC_NO_CONTENT;\r
+ }\r
+ }\r
+\r
+ // LPS-5415\r
+\r
+ if (webDavRequest.isMac()) {\r
+ try {\r
+ FileEntry destFileEntry = DLAppServiceUtil.getFileEntry(\r
+ groupId, newParentFolderId, title);\r
+\r
+ InputStream is = fileEntry.getContentStream();\r
+\r
+ file = FileUtil.createTempFile(is);\r
+\r
+ DLAppServiceUtil.updateFileEntry(\r
+ destFileEntry.getFileEntryId(),\r
+ destFileEntry.getTitle(), destFileEntry.getMimeType(),\r
+ destFileEntry.getTitle(),\r
+ destFileEntry.getDescription(), changeLog, false, file,\r
+ serviceContext);\r
+\r
+ DLAppServiceUtil.deleteFileEntry(\r
+ fileEntry.getFileEntryId());\r
+\r
+ return status;\r
+ }\r
+ catch (NoSuchFileEntryException nsfee) {\r
+ }\r
+ }\r
+ \r
+ DLAppServiceUtil.updateFileEntry(\r
+ fileEntry.getFileEntryId(), sourceFileName,\r
+ fileEntry.getMimeType(), title, description, changeLog, false,\r
+ file, serviceContext);\r
+\r
+ if (fileEntry.getFolderId() != newParentFolderId) {\r
+ fileEntry = DLAppServiceUtil.moveFileEntry(\r
+ fileEntry.getFileEntryId(), newParentFolderId,\r
+ serviceContext);\r
+ }\r
+\r
+ // Apply new parent folder permissions\r
+ PermissionsUtils.setParentPermissionToFile(fileEntry);\r
+ \r
+ return status;\r
+ \r
+ } else {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ }\r
+ catch (PrincipalException pe) {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ catch (DuplicateFileException dfe) {\r
+ return HttpServletResponse.SC_PRECONDITION_FAILED;\r
+ }\r
+ catch (DuplicateFolderNameException dfne) {\r
+ return HttpServletResponse.SC_PRECONDITION_FAILED;\r
+ }\r
+ catch (LockException le) {\r
+ return WebDAVUtil.SC_LOCKED;\r
+ }\r
+ catch (Exception e) {\r
+ throw new WebDAVException(e);\r
+ }\r
+ finally {\r
+ FileUtil.delete(file);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public int putResource(WebDAVRequest webDavRequest) throws WebDAVException {\r
+ File file = null;\r
+\r
+ try {\r
+ HttpServletRequest request = webDavRequest.getHttpServletRequest();\r
+\r
+ String[] pathArray = webDavRequest.getPathArray();\r
+\r
+ long companyId = webDavRequest.getCompanyId();\r
+ long groupId = webDavRequest.getGroupId();\r
+ long parentFolderId = getParentFolderId(companyId, pathArray);\r
+ \r
+ Folder parentFolder = DLAppLocalServiceUtil.getFolder(parentFolderId);\r
+\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), parentFolder, "ADD_OBJECT")) {\r
+\r
+ String title = WebDAVUtil.getResourceName(pathArray);\r
+ String description = StringPool.BLANK;\r
+ String changeLog = StringPool.BLANK;\r
+\r
+ ServiceContext serviceContext = ServiceContextFactory.getInstance(\r
+ request);\r
+\r
+ serviceContext.setAddGroupPermissions(\r
+ isAddGroupPermissions(groupId));\r
+ serviceContext.setAddGuestPermissions(true);\r
+\r
+ String contentType = GetterUtil.get(\r
+ request.getHeader(HttpHeaders.CONTENT_TYPE),\r
+ ContentTypes.APPLICATION_OCTET_STREAM);\r
+\r
+ String extension = FileUtil.getExtension(title);\r
+\r
+ file = FileUtil.createTempFile(extension);\r
+\r
+ FileUtil.write(file, request.getInputStream());\r
+\r
+ if (contentType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {\r
+ contentType = MimeTypesUtil.getContentType(file, title);\r
+ }\r
+\r
+ try {\r
+ FileEntry fileEntry = DLAppServiceUtil.getFileEntry(\r
+ groupId, parentFolderId, title);\r
+\r
+ if (!hasLock(fileEntry, webDavRequest.getLockUuid()) &&\r
+ (fileEntry.getLock() != null)) {\r
+\r
+ return WebDAVUtil.SC_LOCKED;\r
+ }\r
+\r
+ long fileEntryId = fileEntry.getFileEntryId();\r
+\r
+ description = fileEntry.getDescription();\r
+\r
+ String[] assetTagNames = AssetTagLocalServiceUtil.getTagNames(\r
+ DLFileEntryConstants.getClassName(),\r
+ fileEntry.getFileEntryId());\r
+\r
+ serviceContext.setAssetTagNames(assetTagNames);\r
+\r
+ /*DLAppServiceUtil.updateFileEntry(\r
+ fileEntryId, title, contentType, title, description,\r
+ changeLog, false, file, serviceContext);*/\r
+\r
+ DLAppUtil.updateFileEntry(fileEntry, title, file);\r
+\r
+ }\r
+ catch (NoSuchFileEntryException nsfee) {\r
+ if (file.length() == 0) {\r
+ serviceContext.setWorkflowAction(\r
+ WorkflowConstants.ACTION_SAVE_DRAFT);\r
+ }\r
+\r
+ FileEntry fileEntry = DLAppServiceUtil.addFileEntry(\r
+ groupId, parentFolderId, title, contentType, title,\r
+ description, changeLog, file, serviceContext);\r
+ \r
+ // Apply parent folder permissions to this file\r
+ PermissionsUtils.setParentPermissionToFile(fileEntry);\r
+ \r
+ // Reindex\r
+ Indexer indexer = IndexerRegistryUtil.getIndexer(DLFileEntry.class);\r
+ indexer.reindex(fileEntry);\r
+\r
+ }\r
+ \r
+ if (_log.isInfoEnabled()) {\r
+ _log.info(\r
+ "Added " + StringUtil.merge(pathArray, StringPool.SLASH));\r
+ }\r
+ \r
+ return HttpServletResponse.SC_CREATED;\r
+ \r
+ } else {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ }\r
+ catch (PrincipalException pe) {\r
+ return HttpServletResponse.SC_FORBIDDEN;\r
+ }\r
+ catch (NoSuchFolderException nsfe) {\r
+ return HttpServletResponse.SC_CONFLICT;\r
+ }\r
+ catch (PortalException pe) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn(pe, pe);\r
+ }\r
+ return HttpServletResponse.SC_CONFLICT;\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e);\r
+ throw new WebDAVException(e);\r
+ }\r
+ finally {\r
+ FileUtil.delete(file);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public Lock refreshResourceLock(\r
+ WebDAVRequest webDavRequest, String uuid, long timeout)\r
+ throws WebDAVException {\r
+\r
+ Resource resource = getResource(webDavRequest);\r
+\r
+ Lock lock = null;\r
+\r
+ try {\r
+ if (resource instanceof DLFileEntryResourceImpl) {\r
+ lock = DLAppServiceUtil.refreshFileEntryLock(uuid, timeout);\r
+ }\r
+ else {\r
+ lock = DLAppServiceUtil.refreshFolderLock(uuid, timeout);\r
+ }\r
+\r
+ resource.setLock(lock);\r
+ }\r
+ catch (Exception e) {\r
+ throw new WebDAVException(e);\r
+ }\r
+\r
+ return lock;\r
+ }\r
+\r
+ @Override\r
+ public boolean unlockResource(WebDAVRequest webDavRequest, String token)\r
+ throws WebDAVException {\r
+\r
+ Resource resource = getResource(webDavRequest);\r
+\r
+ try {\r
+ if (resource instanceof DLFileEntryResourceImpl) {\r
+ FileEntry fileEntry = (FileEntry)resource.getModel();\r
+\r
+ DLAppServiceUtil.checkInFileEntry(\r
+ fileEntry.getFileEntryId(), token);\r
+\r
+ if (webDavRequest.isAppleDoubleRequest()) {\r
+ DLAppServiceUtil.deleteFileEntry(\r
+ fileEntry.getFileEntryId());\r
+ }\r
+ }\r
+ else {\r
+ Folder folder = (Folder)resource.getModel();\r
+\r
+ DLAppServiceUtil.unlockFolder(\r
+ folder.getRepositoryId(), folder.getParentFolderId(),\r
+ folder.getName(), token);\r
+ }\r
+ \r
+ resource.setLock(null);\r
+\r
+ return true;\r
+ }\r
+ catch (Exception e) {\r
+ if (e instanceof InvalidLockException) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn(e.getMessage());\r
+ }\r
+ }\r
+ else {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn("Unable to unlock file entry", e);\r
+ }\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ protected boolean deleteResource(\r
+ long groupId, long parentFolderId, String name, String lockUuid)\r
+ throws Exception {\r
+ \r
+ \r
+ try {\r
+ Folder folder = DLAppServiceUtil.getFolder(\r
+ groupId, parentFolderId, name);\r
+\r
+ DLAppServiceUtil.deleteFolder(folder.getFolderId());\r
+\r
+ return true;\r
+ }\r
+ catch (NoSuchFolderException nsfe) {\r
+ try {\r
+ FileEntry fileEntry = DLAppServiceUtil.getFileEntry(\r
+ groupId, parentFolderId, name);\r
+\r
+ if (!hasLock(fileEntry, lockUuid) &&\r
+ (fileEntry.getLock() != null)) {\r
+ throw new LockException();\r
+ }\r
+\r
+ DLAppServiceUtil.deleteFileEntryByTitle(\r
+ groupId, parentFolderId, name);\r
+\r
+ return true;\r
+ }\r
+ catch (NoSuchFileEntryException nsfee) {\r
+ _log.error(nsfee);\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ protected List<Resource> getFileEntries(\r
+ WebDAVRequest webDavRequest, long parentFolderId)\r
+ throws Exception {\r
+\r
+ List<Resource> resources = new ArrayList<Resource>();\r
+\r
+ List<FileEntry> fileEntries = DLAppServiceUtil.getFileEntries(\r
+ webDavRequest.getGroupId(), parentFolderId);\r
+\r
+ for (FileEntry fileEntry : fileEntries) {\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), fileEntry, "VIEW")) {\r
+ Resource resource = toResource(webDavRequest, fileEntry, true);\r
+ resources.add(resource);\r
+ }\r
+ }\r
+\r
+ return resources;\r
+ }\r
+ \r
+ protected long getFolderId(long companyId, String[] pathArray)\r
+ throws Exception {\r
+\r
+ return getFolderId(companyId, pathArray, false);\r
+ }\r
+\r
+ protected long getFolderId(\r
+ long companyId, String[] pathArray, boolean parent)\r
+ throws Exception {\r
+\r
+ long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;\r
+\r
+ if (pathArray.length <= 1) {\r
+ return folderId;\r
+ }\r
+ else {\r
+ long groupId = WebDAVUtil.getGroupId(companyId, pathArray);\r
+\r
+ int x = pathArray.length;\r
+\r
+ if (parent) {\r
+ x--;\r
+ }\r
+\r
+ for (int i = 2; i < x; i++) {\r
+ String name = pathArray[i];\r
+\r
+ Folder folder = DLAppServiceUtil.getFolder(\r
+ groupId, folderId, name);\r
+\r
+ if (groupId == folder.getRepositoryId()) {\r
+ folderId = folder.getFolderId();\r
+ }\r
+ }\r
+ }\r
+\r
+ return folderId;\r
+ }\r
+ \r
+ protected List<Resource> getFolders(\r
+ WebDAVRequest webDavRequest, long parentFolderId)\r
+ throws Exception {\r
+ \r
+ List<Resource> resources = new ArrayList<Resource>();\r
+\r
+ long groupId = webDavRequest.getGroupId();\r
+\r
+ List<Folder> folders = DLAppServiceUtil.getFolders(\r
+ groupId, parentFolderId, false);\r
+\r
+ for (Folder folder : folders) {\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), folder, "VIEW")) {\r
+ Resource resource = toResource(webDavRequest, folder, true);\r
+ resources.add(resource);\r
+ }\r
+ }\r
+\r
+ return resources;\r
+ }\r
+\r
+ protected long getParentFolderId(long companyId, String[] pathArray)\r
+ throws Exception {\r
+\r
+ return getFolderId(companyId, pathArray, true);\r
+ }\r
+\r
+ protected boolean hasLock(FileEntry fileEntry, String lockUuid)\r
+ throws Exception {\r
+\r
+ if (Validator.isNull(lockUuid)) {\r
+\r
+ // Client does not claim to know of a lock\r
+\r
+ return fileEntry.hasLock();\r
+ }\r
+ else {\r
+\r
+ // Client claims to know of a lock. Verify the lock UUID.\r
+\r
+ try {\r
+ return DLAppServiceUtil.verifyFileEntryLock(\r
+ fileEntry.getRepositoryId(), fileEntry.getFileEntryId(),\r
+ lockUuid);\r
+ }\r
+ catch (NoSuchLockException nsle) {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+\r
+ protected Resource toResource(\r
+ WebDAVRequest webDavRequest, FileEntry fileEntry, boolean appendPath) throws Exception {\r
+ \r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), fileEntry, "VIEW")) {\r
+ String parentPath = getRootPath() + webDavRequest.getPath();\r
+ String name = StringPool.BLANK;\r
+\r
+ if (appendPath) {\r
+ name = fileEntry.getTitle();\r
+ }\r
+\r
+ return new DLFileEntryResourceImpl(\r
+ webDavRequest, fileEntry, parentPath, name);\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ protected Resource toResource(\r
+ WebDAVRequest webDavRequest, Folder folder, boolean appendPath) {\r
+\r
+ try {\r
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(webDavRequest.getPermissionChecker(), folder, "VIEW")) {\r
+ String parentPath = getRootPath() + webDavRequest.getPath();\r
+ String name = StringPool.BLANK;\r
+\r
+ if (appendPath) {\r
+ name = folder.getName();\r
+ }\r
+\r
+ Resource resource = new BaseResourceImpl(\r
+ parentPath, name, folder.getName(), folder.getCreateDate(),\r
+ folder.getModifiedDate());\r
+\r
+ resource.setModel(folder);\r
+ resource.setClassName(Folder.class.getName());\r
+ resource.setPrimaryKey(folder.getPrimaryKey());\r
+\r
+ return resource;\r
+ } else {\r
+ return null;\r
+ }\r
+ } catch (Exception e) {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(DLWebDAVStorageImpl.class);\r
+\r
+}
\ No newline at end of file