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