/** * 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.internal.portlet.action; import com.liferay.document.library.kernel.model.DLFolderConstants; import com.liferay.document.library.kernel.service.DLAppService; import com.liferay.document.library.web.constants.DLPortletKeys; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.portlet.PortletResponseUtil; import com.liferay.portal.kernel.portlet.bridges.mvc.MVCResourceCommand; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.repository.model.FileShortcut; import com.liferay.portal.kernel.repository.model.Folder; import com.liferay.portal.kernel.servlet.HttpHeaders; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.ContentTypes; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.StreamUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.kernel.zip.ZipWriter; import com.liferay.portal.kernel.zip.ZipWriterFactoryUtil; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.List; import javax.portlet.PortletException; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Brian Wing Shun Chan * @author Alexander Chow * @author Sergio González * @author Levente Hudák * @author Roberto Díaz */ @Component( property = { "javax.portlet.name=" + DLPortletKeys.DOCUMENT_LIBRARY, "javax.portlet.name=" + DLPortletKeys.DOCUMENT_LIBRARY_ADMIN, "javax.portlet.name=" + DLPortletKeys.MEDIA_GALLERY_DISPLAY, "mvc.command.name=/document_library/download_entry", "mvc.command.name=/document_library/download_folder" }, service = MVCResourceCommand.class ) public class DownloadEntriesMVCResourceCommand implements MVCResourceCommand { @Override public boolean serveResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws PortletException { try { String resourceID = GetterUtil.getString( resourceRequest.getResourceID()); if (resourceID.equals("/document_library/download_folder")) { downloadFolder(resourceRequest, resourceResponse); } else { downloadFileEntries(resourceRequest, resourceResponse); } return true; } catch (Exception e) { throw new PortletException(e); } } protected void downloadFileEntries( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute( WebKeys.THEME_DISPLAY); long folderId = ParamUtil.getLong(resourceRequest, "folderId"); File file = null; InputStream inputStream = null; try { List<FileEntry> fileEntries = ActionUtil.getFileEntries( resourceRequest); List<FileShortcut> fileShortcuts = ActionUtil.getFileShortcuts( resourceRequest); List<Folder> folders = ActionUtil.getFolders(resourceRequest); if (fileEntries.isEmpty() && fileShortcuts.isEmpty() && folders.isEmpty()) { return; } else if ((fileEntries.size() == 1) && fileShortcuts.isEmpty() && folders.isEmpty()) { FileEntry fileEntry = fileEntries.get(0); PortletResponseUtil.sendFile( resourceRequest, resourceResponse, fileEntry.getFileName(), fileEntry.getContentStream(), 0, fileEntry.getMimeType(), HttpHeaders.CONTENT_DISPOSITION_ATTACHMENT); } else if ((fileShortcuts.size() == 1) && fileEntries.isEmpty() && folders.isEmpty()) { FileShortcut fileShortcut = fileShortcuts.get(0); FileEntry fileEntry = _dlAppService.getFileEntry( fileShortcut.getToFileEntryId()); PortletResponseUtil.sendFile( resourceRequest, resourceResponse, fileEntry.getFileName(), fileEntry.getContentStream(), 0, fileEntry.getMimeType(), HttpHeaders.CONTENT_DISPOSITION_ATTACHMENT); } else { String zipFileName = getZipFileName(folderId, themeDisplay); ZipWriter zipWriter = ZipWriterFactoryUtil.getZipWriter(); for (FileEntry fileEntry : fileEntries) { zipFileEntry(fileEntry, StringPool.SLASH, zipWriter); } for (FileShortcut fileShortcut : fileShortcuts) { FileEntry fileEntry = _dlAppService.getFileEntry( fileShortcut.getToFileEntryId()); zipFileEntry(fileEntry, StringPool.SLASH, zipWriter); } for (Folder folder : folders) { zipFolder( folder.getRepositoryId(), folder.getFolderId(), StringPool.SLASH.concat(folder.getName()), zipWriter); } file = zipWriter.getFile(); inputStream = new FileInputStream(file); PortletResponseUtil.sendFile( resourceRequest, resourceResponse, zipFileName, inputStream, ContentTypes.APPLICATION_ZIP); } } finally { StreamUtil.cleanUp(inputStream); if (file != null) { file.delete(); } } } protected void downloadFolder( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute( WebKeys.THEME_DISPLAY); long repositoryId = ParamUtil.getLong(resourceRequest, "repositoryId"); long folderId = ParamUtil.getLong(resourceRequest, "folderId"); File file = null; InputStream inputStream = null; try { String zipFileName = getZipFileName(folderId, themeDisplay); ZipWriter zipWriter = ZipWriterFactoryUtil.getZipWriter(); zipFolder(repositoryId, folderId, StringPool.SLASH, zipWriter); file = zipWriter.getFile(); inputStream = new FileInputStream(file); PortletResponseUtil.sendFile( resourceRequest, resourceResponse, zipFileName, inputStream, ContentTypes.APPLICATION_ZIP); } finally { StreamUtil.cleanUp(inputStream); if (file != null) { file.delete(); } } } protected String getZipFileName(long folderId, ThemeDisplay themeDisplay) throws PortalException { if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { Folder folder = _dlAppService.getFolder(folderId); return folder.getName() + ".zip"; } else { return themeDisplay.getScopeGroupName() + ".zip"; } } @Reference(unbind = "-") protected void setDLAppService(DLAppService dlAppService) { _dlAppService = dlAppService; } protected void zipFileEntry( FileEntry fileEntry, String path, ZipWriter zipWriter) throws Exception { zipWriter.addEntry( path + StringPool.SLASH + fileEntry.getFileName(), fileEntry.getContentStream()); } protected void zipFolder( long repositoryId, long folderId, String path, ZipWriter zipWriter) throws Exception { List<Object> foldersAndFileEntriesAndFileShortcuts = _dlAppService.getFoldersAndFileEntriesAndFileShortcuts( repositoryId, folderId, WorkflowConstants.STATUS_APPROVED, false, QueryUtil.ALL_POS, QueryUtil.ALL_POS); for (Object entry : foldersAndFileEntriesAndFileShortcuts) { if (entry instanceof Folder) { Folder folder = (Folder)entry; zipFolder( folder.getRepositoryId(), folder.getFolderId(), path.concat(StringPool.SLASH).concat(folder.getName()), zipWriter); } else if (entry instanceof FileEntry) { zipFileEntry((FileEntry)entry, path, zipWriter); } else if (entry instanceof FileShortcut) { FileShortcut fileShortcut = (FileShortcut)entry; FileEntry fileEntry = _dlAppService.getFileEntry( fileShortcut.getToFileEntryId()); zipFileEntry(fileEntry, path, zipWriter); } } } private DLAppService _dlAppService; }