001    /**
002     * Copyright (c) 2000-present 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.repository.liferayrepository.model.LiferayFileEntry;
028    import com.liferay.portal.security.auth.PrincipalException;
029    import com.liferay.portal.security.permission.ActionKeys;
030    import com.liferay.portal.security.permission.PermissionChecker;
031    import com.liferay.portal.struts.ActionConstants;
032    import com.liferay.portal.struts.PortletAction;
033    import com.liferay.portal.theme.ThemeDisplay;
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.DLFileEntry;
038    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
039    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
040    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
041    import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
042    import com.liferay.portlet.documentlibrary.util.DLUtil;
043    import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
044    
045    import java.io.File;
046    import java.io.FileInputStream;
047    import java.io.IOException;
048    import java.io.InputStream;
049    
050    import java.util.List;
051    
052    import javax.portlet.ActionRequest;
053    import javax.portlet.ActionResponse;
054    import javax.portlet.PortletConfig;
055    
056    import javax.servlet.ServletException;
057    import javax.servlet.http.HttpServletRequest;
058    import javax.servlet.http.HttpServletResponse;
059    
060    import org.apache.struts.action.ActionForm;
061    import org.apache.struts.action.ActionForward;
062    import org.apache.struts.action.ActionMapping;
063    
064    /**
065     * @author Brian Wing Shun Chan
066     * @author Jorge Ferrer
067     * @author Charles May
068     * @author Bruno Farache
069     */
070    public class GetFileAction extends PortletAction {
071    
072            @Override
073            public void processAction(
074                            ActionMapping actionMapping, ActionForm actionForm,
075                            PortletConfig portletConfig, ActionRequest actionRequest,
076                            ActionResponse actionResponse)
077                    throws Exception {
078    
079                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
080                            actionRequest);
081                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
082                            actionResponse);
083    
084                    try {
085                            long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
086    
087                            long folderId = ParamUtil.getLong(actionRequest, "folderId");
088                            String name = ParamUtil.getString(actionRequest, "name");
089                            String title = ParamUtil.getString(actionRequest, "title");
090                            String version = ParamUtil.getString(actionRequest, "version");
091    
092                            long fileShortcutId = ParamUtil.getLong(
093                                    actionRequest, "fileShortcutId");
094    
095                            String uuid = ParamUtil.getString(actionRequest, "uuid");
096    
097                            String targetExtension = ParamUtil.getString(
098                                    actionRequest, "targetExtension");
099    
100                            ThemeDisplay themeDisplay =
101                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
102    
103                            long groupId = ParamUtil.getLong(
104                                    actionRequest, "groupId", themeDisplay.getScopeGroupId());
105    
106                            getFile(
107                                    fileEntryId, folderId, name, title, version, fileShortcutId,
108                                    uuid, groupId, targetExtension, request, response);
109    
110                            setForward(actionRequest, ActionConstants.COMMON_NULL);
111                    }
112                    catch (NoSuchFileEntryException nsfee) {
113                            PortalUtil.sendError(
114                                    HttpServletResponse.SC_NOT_FOUND, nsfee, actionRequest,
115                                    actionResponse);
116                    }
117                    catch (PrincipalException pe) {
118                            processPrincipalException(pe, request, response);
119                    }
120                    catch (Exception e) {
121                            PortalUtil.sendError(e, actionRequest, actionResponse);
122                    }
123            }
124    
125            @Override
126            public ActionForward strutsExecute(
127                            ActionMapping actionMapping, ActionForm actionForm,
128                            HttpServletRequest request, HttpServletResponse response)
129                    throws Exception {
130    
131                    try {
132                            long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
133    
134                            long folderId = ParamUtil.getLong(request, "folderId");
135                            String name = ParamUtil.getString(request, "name");
136                            String title = ParamUtil.getString(request, "title");
137                            String version = ParamUtil.getString(request, "version");
138    
139                            long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
140    
141                            String uuid = ParamUtil.getString(request, "uuid");
142    
143                            String targetExtension = ParamUtil.getString(
144                                    request, "targetExtension");
145    
146                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
147                                    WebKeys.THEME_DISPLAY);
148    
149                            long groupId = ParamUtil.getLong(
150                                    request, "groupId", themeDisplay.getScopeGroupId());
151    
152                            getFile(
153                                    fileEntryId, folderId, name, title, version, fileShortcutId,
154                                    uuid, groupId, targetExtension, request, response);
155    
156                            return null;
157                    }
158                    catch (PrincipalException pe) {
159                            processPrincipalException(pe, request, response);
160    
161                            return null;
162                    }
163                    catch (Exception e) {
164                            PortalUtil.sendError(e, request, response);
165    
166                            return null;
167                    }
168            }
169    
170            protected void getFile(
171                            long fileEntryId, long folderId, String name, String title,
172                            String version, long fileShortcutId, String uuid, long groupId,
173                            String targetExtension, HttpServletRequest request,
174                            HttpServletResponse response)
175                    throws Exception {
176    
177                    if (name.startsWith("DLFE-")) {
178                            name = name.substring(5);
179                    }
180    
181                    name = FileUtil.stripExtension(name);
182    
183                    FileEntry fileEntry = null;
184    
185                    if (Validator.isNotNull(uuid) && (groupId > 0)) {
186                            fileEntry = DLAppServiceUtil.getFileEntryByUuidAndGroupId(
187                                    uuid, groupId);
188    
189                            folderId = fileEntry.getFolderId();
190                    }
191    
192                    if (fileEntryId > 0) {
193                            fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
194                    }
195                    else if (fileShortcutId <= 0) {
196                            if (Validator.isNotNull(title)) {
197                                    fileEntry = DLAppServiceUtil.getFileEntry(
198                                            groupId, folderId, title);
199                            }
200                            else if (Validator.isNotNull(name)) {
201                                    DLFileEntry dlFileEntry =
202                                            DLFileEntryLocalServiceUtil.fetchFileEntryByName(
203                                                    groupId, folderId, name);
204    
205                                    if (dlFileEntry == null) {
206    
207                                            // LPS-30374
208    
209                                            List<DLFileEntry> dlFileEntries =
210                                                    DLFileEntryLocalServiceUtil.getFileEntries(
211                                                            folderId, name);
212    
213                                            if (!dlFileEntries.isEmpty()) {
214                                                    dlFileEntry = dlFileEntries.get(0);
215                                            }
216                                    }
217    
218                                    if (dlFileEntry != null) {
219                                            ThemeDisplay themeDisplay =
220                                                    (ThemeDisplay)request.getAttribute(
221                                                            WebKeys.THEME_DISPLAY);
222    
223                                            PermissionChecker permissionChecker =
224                                                    themeDisplay.getPermissionChecker();
225    
226                                            DLFileEntryPermission.check(
227                                                    permissionChecker, dlFileEntry, ActionKeys.VIEW);
228    
229                                            fileEntry = new LiferayFileEntry(dlFileEntry);
230                                    }
231                            }
232                    }
233                    else {
234                            DLFileShortcut fileShortcut = DLAppServiceUtil.getFileShortcut(
235                                    fileShortcutId);
236    
237                            fileEntryId = fileShortcut.getToFileEntryId();
238    
239                            fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
240                    }
241    
242                    if (Validator.isNull(version)) {
243                            if ((fileEntry != null) &&
244                                    Validator.isNotNull(fileEntry.getVersion())) {
245    
246                                    version = fileEntry.getVersion();
247                            }
248                            else {
249                                    throw new NoSuchFileEntryException(
250                                            "{fileEntryId=" + fileEntryId + "}");
251                            }
252                    }
253    
254                    FileVersion fileVersion = fileEntry.getFileVersion(version);
255    
256                    InputStream is = fileVersion.getContentStream(true);
257    
258                    String fileName = fileVersion.getTitle();
259    
260                    String sourceExtension = fileVersion.getExtension();
261    
262                    if (Validator.isNotNull(sourceExtension) &&
263                            !fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
264    
265                            fileName += StringPool.PERIOD + sourceExtension;
266                    }
267    
268                    long contentLength = fileVersion.getSize();
269                    String contentType = fileVersion.getMimeType();
270    
271                    if (Validator.isNotNull(targetExtension)) {
272                            String id = DLUtil.getTempFileId(
273                                    fileEntry.getFileEntryId(), version);
274    
275                            File convertedFile = DocumentConversionUtil.convert(
276                                    id, is, sourceExtension, targetExtension);
277    
278                            if (convertedFile != null) {
279                                    fileName = FileUtil.stripExtension(fileName).concat(
280                                            StringPool.PERIOD).concat(targetExtension);
281                                    is = new FileInputStream(convertedFile);
282                                    contentLength = convertedFile.length();
283                                    contentType = MimeTypesUtil.getContentType(fileName);
284                            }
285                    }
286    
287                    ServletResponseUtil.sendFile(
288                            request, response, fileName, is, contentLength, contentType);
289            }
290    
291            @Override
292            protected boolean isCheckMethodOnProcessAction() {
293                    return _CHECK_METHOD_ON_PROCESS_ACTION;
294            }
295    
296            protected void processPrincipalException(
297                            Throwable t, HttpServletRequest request,
298                            HttpServletResponse response)
299                    throws IOException, ServletException {
300    
301                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
302                            WebKeys.THEME_DISPLAY);
303    
304                    PermissionChecker permissionChecker =
305                            themeDisplay.getPermissionChecker();
306    
307                    User user = permissionChecker.getUser();
308    
309                    if ((user != null) && !user.isDefaultUser()) {
310                            PortalUtil.sendError(
311                                    HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
312                                    response);
313    
314                            return;
315                    }
316    
317                    String redirect = PortalUtil.getPathMain() + "/portal/login";
318    
319                    String currentURL = PortalUtil.getCurrentURL(request);
320    
321                    redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
322    
323                    response.sendRedirect(redirect);
324            }
325    
326            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
327    
328    }