/**
* 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.portlet.documentlibrary.sharepoint;
import com.liferay.asset.kernel.service.AssetTagLocalServiceUtil;
import com.liferay.document.library.kernel.exception.NoSuchFileEntryException;
import com.liferay.document.library.kernel.exception.NoSuchFolderException;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppServiceUtil;
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.service.ServiceContext;
import com.liferay.portal.kernel.servlet.HttpHeaders;
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.HttpUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.sharepoint.BaseSharepointStorageImpl;
import com.liferay.portal.sharepoint.SharepointRequest;
import com.liferay.portal.sharepoint.SharepointUtil;
import com.liferay.portal.sharepoint.Tree;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
/**
* @author Bruno Farache
*/
public class DLSharepointStorageImpl extends BaseSharepointStorageImpl {
@Override
public void addDocumentElements(
SharepointRequest sharepointRequest, Element element)
throws Exception {
String parentFolderPath = sharepointRequest.getRootPath();
long groupId = SharepointUtil.getGroupId(parentFolderPath);
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
if (parentFolderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
return;
}
List<FileEntry> fileEntries = DLAppServiceUtil.getFileEntries(
groupId, parentFolderId);
for (FileEntry fileEntry : fileEntries) {
String documentPath = parentFolderPath.concat(
StringPool.SLASH).concat(fileEntry.getTitle());
addDocumentElement(
element, documentPath, fileEntry.getCreateDate(),
fileEntry.getModifiedDate(), fileEntry.getUserName());
}
}
@Override
public void createFolder(SharepointRequest sharepointRequest)
throws Exception {
String folderPath = sharepointRequest.getRootPath();
String parentFolderPath = getParentFolderPath(folderPath);
long groupId = SharepointUtil.getGroupId(parentFolderPath);
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
String folderName = getResourceName(folderPath);
String description = StringPool.BLANK;
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(true);
serviceContext.setAddGuestPermissions(true);
DLAppServiceUtil.addFolder(
groupId, parentFolderId, folderName, description, serviceContext);
}
@Override
public InputStream getDocumentInputStream(
SharepointRequest sharepointRequest)
throws Exception {
FileEntry fileEntry = getFileEntry(sharepointRequest);
return fileEntry.getContentStream();
}
@Override
public Tree getDocumentsTree(SharepointRequest sharepointRequest)
throws Exception {
Tree documentsTree = new Tree();
String parentFolderPath = sharepointRequest.getRootPath();
long groupId = SharepointUtil.getGroupId(parentFolderPath);
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
List<FileEntry> fileEntries = DLAppServiceUtil.getFileEntries(
groupId, parentFolderId);
for (FileEntry fileEntry : fileEntries) {
documentsTree.addChild(
getFileEntryTree(fileEntry, parentFolderPath));
}
return documentsTree;
}
@Override
public Tree getDocumentTree(SharepointRequest sharepointRequest)
throws Exception {
String documentPath = sharepointRequest.getRootPath();
String parentFolderPath = getParentFolderPath(documentPath);
FileEntry fileEntry = getFileEntry(sharepointRequest);
return getFileEntryTree(fileEntry, parentFolderPath);
}
@Override
public Tree getFoldersTree(SharepointRequest sharepointRequest)
throws Exception {
Tree foldersTree = new Tree();
String parentFolderPath = sharepointRequest.getRootPath();
long groupId = SharepointUtil.getGroupId(parentFolderPath);
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
List<Folder> folders = DLAppServiceUtil.getFolders(
groupId, parentFolderId, false);
for (Folder folder : folders) {
foldersTree.addChild(getFolderTree(folder, parentFolderPath));
}
foldersTree.addChild(getFolderTree(parentFolderPath));
return foldersTree;
}
@Override
public Tree getFolderTree(SharepointRequest sharepointRequest)
throws Exception {
String folderPath = sharepointRequest.getRootPath();
String parentFolderPath = getParentFolderPath(folderPath);
long groupId = SharepointUtil.getGroupId(folderPath);
long folderId = getLastFolderId(
groupId, folderPath, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
Folder folder = DLAppServiceUtil.getFolder(folderId);
return getFolderTree(folder, parentFolderPath);
}
@Override
public void getParentFolderIds(
long groupId, String path, List<Long> folderIds)
throws Exception {
String[] pathArray = SharepointUtil.getPathArray(path);
if (pathArray.length == 0) {
return;
}
long parentFolderId = folderIds.get(folderIds.size() - 1);
Folder folder = DLAppServiceUtil.getFolder(
groupId, parentFolderId, HttpUtil.decodePath(pathArray[0]));
folderIds.add(folder.getFolderId());
if (pathArray.length > 1) {
path = removeFoldersFromPath(path, 1);
getParentFolderIds(groupId, path, folderIds);
}
}
@Override
public Tree[] moveDocument(SharepointRequest sharepointRequest)
throws Exception {
String parentFolderPath = sharepointRequest.getRootPath();
long groupId = SharepointUtil.getGroupId(parentFolderPath);
Folder folder = null;
FileEntry fileEntry = null;
try {
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
folder = DLAppServiceUtil.getFolder(parentFolderId);
}
catch (Exception e1) {
if (e1 instanceof NoSuchFolderException) {
try {
fileEntry = getFileEntry(sharepointRequest);
}
catch (Exception e2) {
}
}
}
Tree movedDocsTree = new Tree();
Tree movedDirsTree = new Tree();
String newPath = sharepointRequest.getParameterValue("newUrl");
String newParentFolderPath = getParentFolderPath(newPath);
long newGroupId = SharepointUtil.getGroupId(newParentFolderPath);
long newParentFolderId = getLastFolderId(
newGroupId, newParentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
String newName = getResourceName(newPath);
ServiceContext serviceContext = new ServiceContext();
if (fileEntry != null) {
File file = null;
try {
long fileEntryId = fileEntry.getFileEntryId();
long folderId = fileEntry.getFolderId();
String mimeType = fileEntry.getMimeType();
String description = fileEntry.getDescription();
String changeLog = StringPool.BLANK;
InputStream is = fileEntry.getContentStream();
file = FileUtil.createTempFile(is);
String[] assetTagNames = AssetTagLocalServiceUtil.getTagNames(
DLFileEntryConstants.getClassName(),
fileEntry.getFileEntryId());
serviceContext.setAssetTagNames(assetTagNames);
fileEntry = DLAppServiceUtil.updateFileEntry(
fileEntryId, newName, mimeType, newName, description,
changeLog, false, file, serviceContext);
if (folderId != newParentFolderId) {
fileEntry = DLAppServiceUtil.moveFileEntry(
fileEntryId, newParentFolderId, serviceContext);
}
Tree documentTree = getFileEntryTree(
fileEntry, newParentFolderPath);
movedDocsTree.addChild(documentTree);
}
finally {
FileUtil.delete(file);
}
}
else if (folder != null) {
long folderId = folder.getFolderId();
String description = folder.getDescription();
if (newParentFolderId != folder.getParentFolderId()) {
folder = DLAppServiceUtil.moveFolder(
folderId, newParentFolderId, serviceContext);
}
if (!newName.equals(folder.getName())) {
DLAppServiceUtil.updateFolder(
folderId, newName, description, serviceContext);
}
Tree folderTree = getFolderTree(folder, newParentFolderPath);
movedDirsTree.addChild(folderTree);
}
return new Tree[] {movedDocsTree, movedDirsTree};
}
@Override
public void putDocument(SharepointRequest sharepointRequest)
throws Exception {
HttpServletRequest request = sharepointRequest.getHttpServletRequest();
String documentPath = sharepointRequest.getRootPath();
String parentFolderPath = getParentFolderPath(documentPath);
long groupId = SharepointUtil.getGroupId(parentFolderPath);
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
String title = getResourceName(documentPath);
String description = StringPool.BLANK;
String changeLog = StringPool.BLANK;
ServiceContext serviceContext = new ServiceContext();
serviceContext.setAddGroupPermissions(true);
serviceContext.setAddGuestPermissions(true);
String contentType = GetterUtil.get(
request.getHeader(HttpHeaders.CONTENT_TYPE),
ContentTypes.APPLICATION_OCTET_STREAM);
String extension = FileUtil.getExtension(title);
File file = null;
try {
file = FileUtil.createTempFile(extension);
FileUtil.write(file, sharepointRequest.getBytes());
if (contentType.equals(ContentTypes.APPLICATION_OCTET_STREAM)) {
contentType = MimeTypesUtil.getContentType(file, title);
}
try {
FileEntry fileEntry = getFileEntry(sharepointRequest);
long fileEntryId = fileEntry.getFileEntryId();
description = fileEntry.getDescription();
String[] assetTagNames = AssetTagLocalServiceUtil.getTagNames(
DLFileEntryConstants.getClassName(),
fileEntry.getFileEntryId());
serviceContext.setAssetTagNames(assetTagNames);
DLAppServiceUtil.updateFileEntry(
fileEntryId, title, contentType, title, description,
changeLog, false, file, serviceContext);
}
catch (NoSuchFileEntryException nsfee) {
if (_log.isDebugEnabled()) {
_log.debug(nsfee, nsfee);
}
DLAppServiceUtil.addFileEntry(
groupId, parentFolderId, title, contentType, title,
description, changeLog, file, serviceContext);
}
}
finally {
FileUtil.delete(file);
}
}
@Override
public Tree[] removeDocument(SharepointRequest sharepointRequest) {
String parentFolderPath = sharepointRequest.getRootPath();
long groupId = SharepointUtil.getGroupId(parentFolderPath);
Folder folder = null;
FileEntry fileEntry = null;
try {
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
folder = DLAppServiceUtil.getFolder(parentFolderId);
}
catch (Exception e1) {
if (e1 instanceof NoSuchFolderException) {
try {
fileEntry = getFileEntry(sharepointRequest);
}
catch (Exception e2) {
}
}
}
Tree documentTree = new Tree();
Tree removedDocsTree = new Tree();
Tree failedDocsTree = new Tree();
Tree folderTree = new Tree();
Tree removedDirsTree = new Tree();
Tree failedDirsTree = new Tree();
if (fileEntry != null) {
try {
documentTree = getFileEntryTree(fileEntry, parentFolderPath);
DLAppServiceUtil.deleteFileEntry(fileEntry.getFileEntryId());
removedDocsTree.addChild(documentTree);
}
catch (Exception e1) {
try {
failedDocsTree.addChild(documentTree);
}
catch (Exception e2) {
}
}
}
else if (folder != null) {
try {
folderTree = getFolderTree(folder, parentFolderPath);
DLAppServiceUtil.deleteFolder(folder.getFolderId());
removedDirsTree.addChild(folderTree);
}
catch (Exception e1) {
try {
failedDirsTree.addChild(folderTree);
}
catch (Exception e2) {
}
}
}
return new Tree[] {
removedDocsTree, removedDirsTree, failedDocsTree, failedDirsTree
};
}
protected FileEntry getFileEntry(SharepointRequest sharepointRequest)
throws Exception {
String documentPath = sharepointRequest.getRootPath();
String parentFolderPath = getParentFolderPath(documentPath);
long groupId = SharepointUtil.getGroupId(parentFolderPath);
long parentFolderId = getLastFolderId(
groupId, parentFolderPath,
DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
String title = getResourceName(documentPath);
return DLAppServiceUtil.getFileEntry(groupId, parentFolderId, title);
}
protected Tree getFileEntryTree(
FileEntry fileEntry, String parentFolderPath) {
String documentPath = parentFolderPath.concat(StringPool.SLASH).concat(
fileEntry.getTitle());
return getDocumentTree(
documentPath, fileEntry.getCreateDate(),
fileEntry.getModifiedDate(), fileEntry.getSize(),
fileEntry.getUserName(), fileEntry.getVersion());
}
protected Tree getFolderTree(Folder folder, String parentFolderPath) {
String folderPath = parentFolderPath.concat(StringPool.SLASH).concat(
folder.getName());
return getFolderTree(
folderPath, folder.getCreateDate(), folder.getModifiedDate(),
folder.getLastPostDate());
}
private static final Log _log = LogFactoryUtil.getLog(
DLSharepointStorageImpl.class);
}