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