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