1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.documentlibrary.action;
24  
25  import com.liferay.portal.PortalException;
26  import com.liferay.portal.kernel.util.ParamUtil;
27  import com.liferay.portal.kernel.util.StringMaker;
28  import com.liferay.portal.kernel.util.StringPool;
29  import com.liferay.portal.kernel.util.Validator;
30  import com.liferay.portal.security.auth.PrincipalException;
31  import com.liferay.portal.security.permission.ActionKeys;
32  import com.liferay.portal.struts.ActionConstants;
33  import com.liferay.portal.struts.PortletAction;
34  import com.liferay.portal.theme.ThemeDisplay;
35  import com.liferay.portal.util.MimeTypesUtil;
36  import com.liferay.portal.util.PortalUtil;
37  import com.liferay.portal.util.WebKeys;
38  import com.liferay.portlet.ActionRequestImpl;
39  import com.liferay.portlet.ActionResponseImpl;
40  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
41  import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
42  import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
43  import com.liferay.portlet.documentlibrary.service.DLFileShortcutServiceUtil;
44  import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
45  import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
46  import com.liferay.util.FileUtil;
47  import com.liferay.util.servlet.ServletResponseUtil;
48  
49  import java.io.InputStream;
50  
51  import javax.portlet.ActionRequest;
52  import javax.portlet.ActionResponse;
53  import javax.portlet.PortletConfig;
54  
55  import javax.servlet.http.HttpServletRequest;
56  import javax.servlet.http.HttpServletResponse;
57  import javax.servlet.jsp.PageContext;
58  
59  import org.apache.struts.action.ActionForm;
60  import org.apache.struts.action.ActionForward;
61  import org.apache.struts.action.ActionMapping;
62  
63  /**
64   * <a href="GetFileAction.java.html"><b><i>View Source</i></b></a>
65   *
66   * @author Brian Wing Shun Chan
67   * @author Jorge Ferrer
68   * @author Charles May
69   * @author Bruno Farache
70   *
71   */
72  public class GetFileAction extends PortletAction {
73  
74      public ActionForward strutsExecute(
75              ActionMapping mapping, ActionForm form, HttpServletRequest req,
76              HttpServletResponse res)
77          throws Exception {
78  
79          try {
80              long folderId = ParamUtil.getLong(req, "folderId");
81              String name = ParamUtil.getString(req, "name");
82              double version = ParamUtil.getDouble(req, "version");
83  
84              long fileShortcutId = ParamUtil.getLong(req, "fileShortcutId");
85  
86              String uuid = ParamUtil.getString(req, "uuid");
87              long groupId = ParamUtil.getLong(req, "groupId");
88  
89              String targetExtension = ParamUtil.getString(
90                  req, "targetExtension");
91  
92              ThemeDisplay themeDisplay =
93                  (ThemeDisplay)req.getAttribute(WebKeys.THEME_DISPLAY);
94  
95              getFile(
96                  folderId, name, version, fileShortcutId, uuid, groupId,
97                  targetExtension, themeDisplay, req, res);
98  
99              return null;
100         }
101         catch (Exception e) {
102             req.setAttribute(PageContext.EXCEPTION, e);
103 
104             return mapping.findForward(ActionConstants.COMMON_ERROR);
105         }
106     }
107 
108     public void processAction(
109             ActionMapping mapping, ActionForm form, PortletConfig config,
110             ActionRequest req, ActionResponse res)
111         throws Exception {
112 
113         long folderId = ParamUtil.getLong(req, "folderId");
114         String name = ParamUtil.getString(req, "name");
115         double version = ParamUtil.getDouble(req, "version");
116 
117         long fileShortcutId = ParamUtil.getLong(req, "fileShortcutId");
118 
119         String uuid = ParamUtil.getString(req, "uuid");
120         long groupId = ParamUtil.getLong(req, "groupId");
121 
122         String targetExtension = ParamUtil.getString(req, "targetExtension");
123 
124         ThemeDisplay themeDisplay =
125             (ThemeDisplay)req.getAttribute(WebKeys.THEME_DISPLAY);
126 
127         HttpServletRequest httpReq =
128             ((ActionRequestImpl)req).getHttpServletRequest();
129         HttpServletResponse httpRes =
130             ((ActionResponseImpl)res).getHttpServletResponse();
131 
132         getFile(
133             folderId, name, version, fileShortcutId, uuid, groupId,
134             targetExtension, themeDisplay, httpReq, httpRes);
135 
136         setForward(req, ActionConstants.COMMON_NULL);
137     }
138 
139     protected void getFile(
140             long folderId, String name, double version, long fileShortcutId,
141             String uuid, long groupId, String targetExtension,
142             ThemeDisplay themeDisplay, HttpServletRequest req,
143             HttpServletResponse res)
144         throws Exception {
145 
146         InputStream is = null;
147 
148         try {
149             long companyId = themeDisplay.getCompanyId();
150             long userId = themeDisplay.getUserId();
151 
152             DLFileEntry fileEntry = null;
153 
154             if (Validator.isNotNull(uuid) && (groupId > 0)) {
155                 try {
156                     fileEntry = DLFileEntryLocalServiceUtil.
157                         getFileEntryByUuidAndGroupId(
158                             uuid, groupId);
159 
160                     folderId = fileEntry.getFolderId();
161                     name = fileEntry.getName();
162                 }
163                 catch (Exception e) {
164                 }
165             }
166 
167             if (fileShortcutId <= 0) {
168                 DLFileEntryPermission.check(
169                     themeDisplay.getPermissionChecker(), folderId, name,
170                     ActionKeys.VIEW);
171             }
172             else {
173                 DLFileShortcut fileShortcut =
174                     DLFileShortcutServiceUtil.getFileShortcut(fileShortcutId);
175 
176                 folderId = fileShortcut.getToFolderId();
177                 name = fileShortcut.getToName();
178             }
179 
180             if (fileEntry == null) {
181                 fileEntry = DLFileEntryLocalServiceUtil.getFileEntry(
182                     folderId, name);
183             }
184 
185             if (version == 0) {
186                 version = fileEntry.getVersion();
187             }
188 
189             is = DLFileEntryLocalServiceUtil.getFileAsStream(
190                 companyId, userId, folderId, name, version);
191 
192             String fileName = fileEntry.getTitleWithExtension();
193 
194             if (Validator.isNotNull(targetExtension)) {
195                 String id = DocumentConversionUtil.getTempFileId(
196                     fileEntry.getFileEntryId(), version);
197 
198                 String sourceExtension = FileUtil.getExtension(name);
199 
200                 InputStream convertedIS = DocumentConversionUtil.convert(
201                     id, is, sourceExtension, targetExtension);
202 
203                 if ((convertedIS != null) && (convertedIS != is)) {
204                     StringMaker sm = new StringMaker();
205 
206                     sm.append(fileEntry.getTitle());
207                     sm.append(StringPool.PERIOD);
208                     sm.append(targetExtension);
209 
210                     fileName = sm.toString();
211 
212                     is = convertedIS;
213                 }
214             }
215 
216             String contentType = MimeTypesUtil.getContentType(fileName);
217 
218             ServletResponseUtil.sendFile(res, fileName, is, contentType);
219         }
220         catch (PortalException pe) {
221             if (pe instanceof PrincipalException) {
222                 PortalUtil.sendError(
223                     HttpServletResponse.SC_FORBIDDEN, new PrincipalException(),
224                     req, res);
225             }
226             else {
227                 PortalUtil.sendError(
228                     HttpServletResponse.SC_NOT_FOUND, pe, req, res);
229             }
230         }
231         finally {
232             ServletResponseUtil.cleanUp(is);
233         }
234     }
235 
236     protected boolean isCheckMethodOnProcessAction() {
237         return _CHECK_METHOD_ON_PROCESS_ACTION;
238     }
239 
240     private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
241 
242 }