--- /dev/null
+/**
+ * Copyright (c) 2000-2012 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.action;
+
+import java.awt.image.RenderedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.ImageIO;
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.PortletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import com.liferay.portal.kernel.image.ImageToolUtil;
+import com.liferay.portal.kernel.repository.model.FileEntry;
+import com.liferay.portal.kernel.repository.model.FileVersion;
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.util.Base64;
+import com.liferay.portal.kernel.util.FileUtil;
+import com.liferay.portal.kernel.util.HttpUtil;
+import com.liferay.portal.kernel.util.MimeTypesOverrideUtil;
+import com.liferay.portal.kernel.util.ParamUtil;
+import com.liferay.portal.kernel.util.StringPool;
+import com.liferay.portal.kernel.util.SystemProperties;
+import com.liferay.portal.kernel.util.Validator;
+import com.liferay.portal.model.User;
+import com.liferay.portal.security.auth.PrincipalException;
+import com.liferay.portal.security.permission.PermissionChecker;
+import com.liferay.portal.service.UserLocalServiceUtil;
+import com.liferay.portal.struts.ActionConstants;
+import com.liferay.portal.struts.PortletAction;
+import com.liferay.portal.theme.ThemeDisplay;
+import com.liferay.portal.util.Portal;
+import com.liferay.portal.util.PortalUtil;
+import com.liferay.portal.util.WebKeys;
+import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
+import com.liferay.portlet.documentlibrary.conversion.util.ENTDocumentConversionServiceUtil;
+import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
+import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
+import com.pentila.entSavoie.servlet.FLVPseudoStreamer;
+import com.pentila.entSavoie.servlet.ServletResponseServiceUtil;
+import com.pentila.entSavoie.utils.ENTMainUtilsLocalServiceUtil;
+
+/**
+ * @author Brian Wing Shun Chan
+ * @author Jorge Ferrer
+ * @author Charles May
+ * @author Bruno Farache
+ */
+public class GetFileAction extends PortletAction {
+
+ @Override
+ public void processAction(
+ ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
+ ActionRequest actionRequest, ActionResponse actionResponse)
+ throws Exception {
+ HttpServletRequest request = PortalUtil.getHttpServletRequest(
+ actionRequest);
+ HttpServletResponse response = PortalUtil.getHttpServletResponse(
+ actionResponse);
+
+ try {
+ long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
+
+ long folderId = ParamUtil.getLong(actionRequest, "folderId");
+ String title = ParamUtil.getString(actionRequest, "title");
+ String version = ParamUtil.getString(actionRequest, "version");
+
+ long fileShortcutId = ParamUtil.getLong(
+ actionRequest, "fileShortcutId");
+
+ String uuid = ParamUtil.getString(actionRequest, "uuid");
+
+ String targetExtension = ParamUtil.getString(
+ actionRequest, "targetExtension");
+
+ String forceContentDisposition = ParamUtil.getString(request, "contentDispo");
+
+ boolean imageThumbnail = ParamUtil.getBoolean(request, "imageThumbnail", false);
+
+ ThemeDisplay themeDisplay =
+ (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
+
+ long groupId = ParamUtil.getLong(
+ actionRequest, "groupId", 0);
+
+ if(groupId <= 0){
+ if(folderId > 0){
+ groupId = DLAppLocalServiceUtil.getFolder(folderId).getGroupId();
+ }
+ else {
+ groupId = themeDisplay.getScopeGroupId();
+ }
+ }
+
+ if (imageThumbnail){
+ imageThumbnailFile(
+ fileEntryId, folderId, title, version, fileShortcutId, uuid,
+ groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
+ }
+ else {
+ getFile(
+ fileEntryId, folderId, title, version, fileShortcutId, uuid,
+ groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
+ }
+
+ setForward(actionRequest, ActionConstants.COMMON_NULL);
+ }
+ catch (NoSuchFileEntryException nsfee) {
+ PortalUtil.sendError(
+ HttpServletResponse.SC_NOT_FOUND, nsfee, actionRequest,
+ actionResponse);
+ }
+ catch (PrincipalException pe) {
+ processPrincipalException(pe, request, response);
+ }
+ catch (Exception e) {
+ PortalUtil.sendError(e, actionRequest, actionResponse);
+ }
+ }
+
+ @Override
+ public ActionForward strutsExecute(
+ ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response)
+ throws Exception {
+ try {
+ long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
+
+ long folderId = ParamUtil.getLong(request, "folderId");
+ String title = ParamUtil.getString(request, "title");
+ String version = ParamUtil.getString(request, "version");
+
+ long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
+
+ String uuid = ParamUtil.getString(request, "uuid");
+
+ String forceContentDisposition = ParamUtil.getString(request, "contentDispo");
+
+ boolean imageThumbnail = ParamUtil.getBoolean(request, "imageThumbnail", false);
+
+ String targetExtension = ParamUtil.getString(
+ request, "targetExtension");
+
+ ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
+ WebKeys.THEME_DISPLAY);
+
+ long groupId = ParamUtil.getLong(
+ request, "groupId", 0);
+
+ if(groupId <= 0){
+ if(folderId > 0){
+ groupId = DLAppLocalServiceUtil.getFolder(folderId).getGroupId();
+ }
+ else {
+ groupId = themeDisplay.getScopeGroupId();
+ }
+ }
+
+ if (imageThumbnail){
+ imageThumbnailFile(
+ fileEntryId, folderId, title, version, fileShortcutId, uuid,
+ groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
+ }
+ else {
+ getFile(
+ fileEntryId, folderId, title, version, fileShortcutId, uuid,
+ groupId, targetExtension, forceContentDisposition, themeDisplay, request, response);
+ }
+
+ return null;
+ }
+ catch (PrincipalException pe) {
+ processPrincipalException(pe, request, response);
+
+ return null;
+ }
+ catch (Exception e) {
+ PortalUtil.sendError(e, request, response);
+
+ return null;
+ }
+ }
+
+ protected void imageThumbnailFile(
+ long fileEntryId, long folderId, String title, String version,
+ long fileShortcutId, String uuid, long groupId,
+ String targetExtension, String forceContentDisposition, ThemeDisplay themeDisplay,
+ HttpServletRequest request, HttpServletResponse response)
+ throws Exception {
+
+ InputStream is = null;
+ File tmpFile = null;
+
+ try {
+ FileEntry fileEntry = null;
+
+ if (Validator.isNotNull(uuid) && (groupId > 0)) {
+ fileEntry = DLAppLocalServiceUtil.getFileEntryByUuidAndGroupId(
+ uuid, groupId);
+
+ folderId = fileEntry.getFolderId();
+ }
+
+ if (fileEntryId > 0) {
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
+ }
+ else if (fileShortcutId <= 0) {
+ if (Validator.isNotNull(title)) {
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(
+ groupId, folderId, title);
+ }
+ }
+ else {
+ DLFileShortcut fileShortcut = DLAppLocalServiceUtil.getFileShortcut(
+ fileShortcutId);
+
+ fileEntryId = fileShortcut.getToFileEntryId();
+
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
+ }
+
+ if (Validator.isNull(version)) {
+ if (Validator.isNotNull(fileEntry.getVersion())) {
+ version = fileEntry.getVersion();
+ }
+ else {
+ throw new NoSuchFileEntryException();
+ }
+ }
+
+ FileVersion fileVersion = fileEntry.getFileVersion(version);
+
+ is = fileVersion.getContentStream(true);
+
+ tmpFile = FileUtil.createTempFile();
+ FileUtil.write(tmpFile, is);
+
+ RenderedImage renderedImage = ImageToolUtil.read(tmpFile).getRenderedImage();
+ RenderedImage thumbnail = ImageToolUtil.scale(renderedImage, 64, 64);
+
+ ByteArrayOutputStream bam = new ByteArrayOutputStream();
+
+ ImageIO.write(thumbnail, "png", bam);
+
+ String fileName = fileEntry.getTitle() + ".png";
+
+ String contentType = "image/png";
+ fileName = convertNonAscii(fileName);
+
+ ServletResponseServiceUtil.sendFile(
+ response, fileName, bam.toByteArray(), contentType, forceContentDisposition);
+
+ }
+ finally {
+ ServletResponseServiceUtil.cleanUp(is);
+ if (tmpFile != null) {
+ tmpFile.delete();
+ }
+ }
+
+ }
+
+ protected void getFile(
+ long fileEntryId, long folderId, String title, String version,
+ long fileShortcutId, String uuid, long groupId,
+ String targetExtension, String forceContentDisposition, ThemeDisplay themeDisplay,
+ HttpServletRequest request, HttpServletResponse response)
+ throws Exception {
+
+ InputStream is = null;
+ InputStream convertedIS = null;
+
+ try {
+ long companyId = themeDisplay.getCompanyId();
+
+ FileEntry fileEntry = null;
+
+ if (Validator.isNotNull(uuid) && (groupId > 0)) {
+ fileEntry = DLAppLocalServiceUtil.getFileEntryByUuidAndGroupId(
+ uuid, groupId);
+
+ folderId = fileEntry.getFolderId();
+ }
+
+ if (fileEntryId > 0) {
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
+ }
+ else if (fileShortcutId <= 0) {
+ if (Validator.isNotNull(title)) {
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(
+ groupId, folderId, title);
+ }
+ }
+ else {
+ DLFileShortcut fileShortcut = DLAppLocalServiceUtil.getFileShortcut(
+ fileShortcutId);
+
+ fileEntryId = fileShortcut.getToFileEntryId();
+
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
+ }
+
+ boolean versionized = true;
+ if (Validator.isNull(version)) {
+ if (Validator.isNotNull(fileEntry.getVersion())) {
+ version = fileEntry.getVersion();
+ versionized = false;
+ }
+ else {
+ throw new NoSuchFileEntryException();
+ }
+ }
+
+ FileVersion fileVersion = fileEntry.getFileVersion(version);
+
+ String fileName = fileVersion.getTitle();
+ String fileExtension = fileEntry.getExtension();
+ int contentLength = (int) fileVersion.getSize();
+ String contentType = fileVersion.getMimeType();
+
+ boolean converted = false;
+ if (Validator.isNotNull(targetExtension)) {
+ InputStream isForId = fileVersion.getContentStream(true);
+
+ String idSecure = ENTDocumentConversionServiceUtil.getFileChecksum(isForId);
+ isForId.close();
+
+ InputStream isToConvert = fileVersion.getContentStream(true);
+
+ String sourceExtension = fileExtension;
+ try{
+ File file = ENTDocumentConversionServiceUtil.convert(
+ idSecure, isToConvert, sourceExtension, targetExtension);
+
+ convertedIS = new FileInputStream(file);
+ contentLength = (int) file.length();
+ if ((convertedIS != null) && (convertedIS != isToConvert)) {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append(fileEntry.getTitle());
+ sb.append(StringPool.PERIOD);
+ sb.append(targetExtension);
+
+ fileName = sb.toString();
+
+ is = convertedIS;
+ converted = true;
+ }
+ } catch (Exception e){
+ _log.error("Fail to convert " + fileName + " (id="+fileEntryId+") to target extenstion " + targetExtension, e);
+ }
+ isToConvert.close();
+ }
+ else {
+ // pas de conversion
+ is = fileVersion.getContentStream(true);
+ contentLength = (int) fileVersion.getSize();
+ }
+
+ fileName = convertNonAscii(fileName);
+
+ if (!converted && !versionized && contentLength==0) {
+ // on a ici un probleme avec la taille des fichiers si on a demande une version paticuliere donc on zappe
+ contentLength = (int)fileEntry.getSize();
+ }
+
+ contentType = MimeTypesOverrideUtil.getContentType(fileName);
+
+ if (fileName.endsWith("mp4")) {
+ contentType="video/mp4";
+ } else if (fileName.endsWith("mp3")) {
+ contentType="audio/mp3";
+ }
+
+ String ppos = request.getParameter("start");
+ long pos = ppos == null || ppos.length() == 0 ? 0 : Long.parseLong(ppos);
+
+ String fcd = forceContentDisposition == null ? "" : forceContentDisposition;
+
+ ServletResponseServiceUtil.sendFile(
+ response, fileName, is, contentLength, contentType, fcd);
+ }
+ finally {
+ ServletResponseServiceUtil.cleanUp(is);
+ if (convertedIS!=null) {
+ convertedIS.close();
+ }
+ }
+ }
+
+ private static final String PLAIN_ASCII =
+ "AaEeIiOoUu" // grave
+ + "AaEeIiOoUuYy" // acute
+ + "AaEeIiOoUuYy" // circumflex
+ + "AaOoNn" // tilde
+ + "AaEeIiOoUuYy" // umlaut
+ + "Aa" // ring
+ + "Cc" // cedilla
+ + "OoUu" // double acute
+ ;
+
+ private static final String UNICODE =
+ "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"
+ + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD"
+ + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177"
+ + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
+ + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF"
+ + "\u00C5\u00E5"
+ + "\u00C7\u00E7"
+ + "\u0150\u0151\u0170\u0171"
+ ;
+
+ // remove accentued from a string and replace with ascii equivalent
+ public static String convertNonAscii(String s) {
+ if (s == null) return null;
+ StringBuilder sb = new StringBuilder();
+ int n = s.length();
+ for (int i = 0; i < n; i++) {
+ char c = s.charAt(i);
+ int pos = UNICODE.indexOf(c);
+ if (pos > -1){
+ sb.append(PLAIN_ASCII.charAt(pos));
+ }
+ else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ @Override
+ protected boolean isCheckMethodOnProcessAction() {
+ return _CHECK_METHOD_ON_PROCESS_ACTION;
+ }
+
+ protected void processPrincipalException(
+ Throwable t, HttpServletRequest request,
+ HttpServletResponse response)
+ throws IOException, ServletException {
+
+ ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
+ WebKeys.THEME_DISPLAY);
+
+ PermissionChecker permissionChecker =
+ themeDisplay.getPermissionChecker();
+
+ long userId = permissionChecker.getUserId();
+
+ User user = null;
+
+ try {
+ user = UserLocalServiceUtil.getUser(userId);
+ }
+ catch (Exception e) {
+ }
+
+ if ((user != null) && !user.isDefaultUser()) {
+ PortalUtil.sendError(
+ HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
+ response);
+
+ return;
+ }
+
+ String redirect =
+ request.getContextPath() + Portal.PATH_MAIN + "/portal/login";
+
+ String currentURL = PortalUtil.getCurrentURL(request);
+
+ redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
+
+ response.sendRedirect(redirect);
+ }
+
+ private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
+
+ private static Log _log = LogFactoryUtil.getLog(GetFileAction.class);
+
+}
\ No newline at end of file