001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.documentlibrary.action;
016    
017    import com.liferay.portal.kernel.repository.model.FileEntry;
018    import com.liferay.portal.kernel.repository.model.FileVersion;
019    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
020    import com.liferay.portal.kernel.util.FileUtil;
021    import com.liferay.portal.kernel.util.HttpUtil;
022    import com.liferay.portal.kernel.util.MimeTypesUtil;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.util.Validator;
026    import com.liferay.portal.model.User;
027    import com.liferay.portal.security.auth.PrincipalException;
028    import com.liferay.portal.security.permission.PermissionChecker;
029    import com.liferay.portal.service.UserLocalServiceUtil;
030    import com.liferay.portal.struts.ActionConstants;
031    import com.liferay.portal.struts.PortletAction;
032    import com.liferay.portal.theme.ThemeDisplay;
033    import com.liferay.portal.util.Portal;
034    import com.liferay.portal.util.PortalUtil;
035    import com.liferay.portal.util.WebKeys;
036    import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
037    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
038    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
039    import com.liferay.portlet.documentlibrary.util.DLUtil;
040    import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
041    
042    import java.io.File;
043    import java.io.FileInputStream;
044    import java.io.IOException;
045    import java.io.InputStream;
046    
047    import javax.portlet.ActionRequest;
048    import javax.portlet.ActionResponse;
049    import javax.portlet.PortletConfig;
050    
051    import javax.servlet.ServletException;
052    import javax.servlet.http.HttpServletRequest;
053    import javax.servlet.http.HttpServletResponse;
054    
055    import org.apache.struts.action.ActionForm;
056    import org.apache.struts.action.ActionForward;
057    import org.apache.struts.action.ActionMapping;
058    
059    /**
060     * @author Brian Wing Shun Chan
061     * @author Jorge Ferrer
062     * @author Charles May
063     * @author Bruno Farache
064     */
065    public class GetFileAction extends PortletAction {
066    
067            @Override
068            public void processAction(
069                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
070                            ActionRequest actionRequest, ActionResponse actionResponse)
071                    throws Exception {
072    
073                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
074                            actionRequest);
075                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
076                            actionResponse);
077    
078                    try {
079                            long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
080    
081                            long folderId = ParamUtil.getLong(actionRequest, "folderId");
082                            String title = ParamUtil.getString(actionRequest, "title");
083                            String version = ParamUtil.getString(actionRequest, "version");
084    
085                            long fileShortcutId = ParamUtil.getLong(
086                                    actionRequest, "fileShortcutId");
087    
088                            String uuid = ParamUtil.getString(actionRequest, "uuid");
089    
090                            String targetExtension = ParamUtil.getString(
091                                    actionRequest, "targetExtension");
092    
093                            ThemeDisplay themeDisplay =
094                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
095    
096                            long groupId = ParamUtil.getLong(
097                                    actionRequest, "groupId", themeDisplay.getScopeGroupId());
098    
099                            getFile(
100                                    fileEntryId, folderId, title, version, fileShortcutId, uuid,
101                                    groupId, targetExtension, themeDisplay, request, response);
102    
103                            setForward(actionRequest, ActionConstants.COMMON_NULL);
104                    }
105                    catch (NoSuchFileEntryException nsfee) {
106                            PortalUtil.sendError(
107                                    HttpServletResponse.SC_NOT_FOUND, nsfee, actionRequest,
108                                    actionResponse);
109                    }
110                    catch (PrincipalException pe) {
111                            processPrincipalException(pe, request, response);
112                    }
113                    catch (Exception e) {
114                            PortalUtil.sendError(e, actionRequest, actionResponse);
115                    }
116            }
117    
118            @Override
119            public ActionForward strutsExecute(
120                            ActionMapping mapping, ActionForm form, HttpServletRequest request,
121                            HttpServletResponse response)
122                    throws Exception {
123    
124                    try {
125                            long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
126    
127                            long folderId = ParamUtil.getLong(request, "folderId");
128                            String title = ParamUtil.getString(request, "title");
129                            String version = ParamUtil.getString(request, "version");
130    
131                            long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
132    
133                            String uuid = ParamUtil.getString(request, "uuid");
134    
135                            String targetExtension = ParamUtil.getString(
136                                    request, "targetExtension");
137    
138                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
139                                    WebKeys.THEME_DISPLAY);
140    
141                            long groupId = ParamUtil.getLong(
142                                    request, "groupId", themeDisplay.getScopeGroupId());
143    
144                            getFile(
145                                    fileEntryId, folderId, title, version, fileShortcutId, uuid,
146                                    groupId, targetExtension, themeDisplay, request, response);
147    
148                            return null;
149                    }
150                    catch (PrincipalException pe) {
151                            processPrincipalException(pe, request, response);
152    
153                            return null;
154                    }
155                    catch (Exception e) {
156                            PortalUtil.sendError(e, request, response);
157    
158                            return null;
159                    }
160            }
161    
162            protected void getFile(
163                            long fileEntryId, long folderId, String title, String version,
164                            long fileShortcutId, String uuid, long groupId,
165                            String targetExtension, ThemeDisplay themeDisplay,
166                            HttpServletRequest request, HttpServletResponse response)
167                    throws Exception {
168    
169                    FileEntry fileEntry = null;
170    
171                    if (Validator.isNotNull(uuid) && (groupId > 0)) {
172                            fileEntry = DLAppServiceUtil.getFileEntryByUuidAndGroupId(
173                                    uuid, groupId);
174    
175                            folderId = fileEntry.getFolderId();
176                    }
177    
178                    if (fileEntryId > 0) {
179                            fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
180                    }
181                    else if (fileShortcutId <= 0) {
182                            if (Validator.isNotNull(title)) {
183                                    fileEntry = DLAppServiceUtil.getFileEntry(
184                                            groupId, folderId, title);
185                            }
186                    }
187                    else {
188                            DLFileShortcut fileShortcut = DLAppServiceUtil.getFileShortcut(
189                                    fileShortcutId);
190    
191                            fileEntryId = fileShortcut.getToFileEntryId();
192    
193                            fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
194                    }
195    
196                    if (Validator.isNull(version)) {
197                            if (Validator.isNotNull(fileEntry.getVersion())) {
198                                    version = fileEntry.getVersion();
199                            }
200                            else {
201                                    throw new NoSuchFileEntryException();
202                            }
203                    }
204    
205                    FileVersion fileVersion = fileEntry.getFileVersion(version);
206    
207                    InputStream is = fileVersion.getContentStream(true);
208                    String fileName = fileVersion.getTitle();
209                    long contentLength = fileVersion.getSize();
210                    String contentType = fileVersion.getMimeType();
211    
212                    if (Validator.isNotNull(targetExtension)) {
213                            String id = DLUtil.getTempFileId(
214                                    fileEntry.getFileEntryId(), version);
215    
216                            String sourceExtension = fileVersion.getExtension();
217    
218                            if (!fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
219                                    fileName += StringPool.PERIOD + sourceExtension;
220                            }
221    
222                            File convertedFile = DocumentConversionUtil.convert(
223                                    id, is, sourceExtension, targetExtension);
224    
225                            if (convertedFile != null) {
226                                    fileName = FileUtil.stripExtension(fileName).concat(
227                                            StringPool.PERIOD).concat(targetExtension);
228                                    is = new FileInputStream(convertedFile);
229                                    contentLength = convertedFile.length();
230                                    contentType = MimeTypesUtil.getContentType(fileName);
231                            }
232                    }
233    
234                    ServletResponseUtil.sendFile(
235                            request, response, fileName, is, contentLength, contentType);
236            }
237    
238            @Override
239            protected boolean isCheckMethodOnProcessAction() {
240                    return _CHECK_METHOD_ON_PROCESS_ACTION;
241            }
242    
243            protected void processPrincipalException(
244                            Throwable t, HttpServletRequest request,
245                            HttpServletResponse response)
246                    throws IOException, ServletException {
247    
248                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
249                            WebKeys.THEME_DISPLAY);
250    
251                    PermissionChecker permissionChecker =
252                            themeDisplay.getPermissionChecker();
253    
254                    long userId = permissionChecker.getUserId();
255    
256                    User user = null;
257    
258                    try {
259                            user = UserLocalServiceUtil.getUser(userId);
260                    }
261                    catch (Exception e) {
262                    }
263    
264                    if ((user != null) && !user.isDefaultUser()) {
265                            PortalUtil.sendError(
266                                    HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
267                                    response);
268    
269                            return;
270                    }
271    
272                    String redirect =
273                            request.getContextPath() + Portal.PATH_MAIN + "/portal/login";
274    
275                    String currentURL = PortalUtil.getCurrentURL(request);
276    
277                    redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
278    
279                    response.sendRedirect(redirect);
280            }
281    
282            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
283    
284    }