001
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.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.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 mapping, ActionForm form, PortletConfig portletConfig,
076 ActionRequest actionRequest, 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 mapping, ActionForm form, HttpServletRequest request,
128 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
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 }
251 }
252
253 FileVersion fileVersion = fileEntry.getFileVersion(version);
254
255 InputStream is = fileVersion.getContentStream(true);
256 String fileName = fileVersion.getTitle();
257 long contentLength = fileVersion.getSize();
258 String contentType = fileVersion.getMimeType();
259
260 if (Validator.isNotNull(targetExtension)) {
261 String id = DLUtil.getTempFileId(
262 fileEntry.getFileEntryId(), version);
263
264 String sourceExtension = fileVersion.getExtension();
265
266 if (!fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
267 fileName += StringPool.PERIOD + sourceExtension;
268 }
269
270 File convertedFile = DocumentConversionUtil.convert(
271 id, is, sourceExtension, targetExtension);
272
273 if (convertedFile != null) {
274 fileName = FileUtil.stripExtension(fileName).concat(
275 StringPool.PERIOD).concat(targetExtension);
276 is = new FileInputStream(convertedFile);
277 contentLength = convertedFile.length();
278 contentType = MimeTypesUtil.getContentType(fileName);
279 }
280 }
281
282 ServletResponseUtil.sendFile(
283 request, response, fileName, is, contentLength, contentType);
284 }
285
286 @Override
287 protected boolean isCheckMethodOnProcessAction() {
288 return _CHECK_METHOD_ON_PROCESS_ACTION;
289 }
290
291 protected void processPrincipalException(
292 Throwable t, HttpServletRequest request,
293 HttpServletResponse response)
294 throws IOException, ServletException {
295
296 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
297 WebKeys.THEME_DISPLAY);
298
299 PermissionChecker permissionChecker =
300 themeDisplay.getPermissionChecker();
301
302 User user = permissionChecker.getUser();
303
304 if ((user != null) && !user.isDefaultUser()) {
305 PortalUtil.sendError(
306 HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
307 response);
308
309 return;
310 }
311
312 String redirect =
313 request.getContextPath() + Portal.PATH_MAIN + "/portal/login";
314
315 String currentURL = PortalUtil.getCurrentURL(request);
316
317 redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
318
319 response.sendRedirect(redirect);
320 }
321
322 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
323
324 }