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