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.PortalUtil;
035 import com.liferay.portal.util.WebKeys;
036 import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
037 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
038 import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
039 import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
040 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
041 import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
042 import com.liferay.portlet.documentlibrary.util.DLUtil;
043 import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
044
045 import java.io.File;
046 import java.io.FileInputStream;
047 import java.io.IOException;
048 import java.io.InputStream;
049
050 import java.util.List;
051
052 import javax.portlet.ActionRequest;
053 import javax.portlet.ActionResponse;
054 import javax.portlet.PortletConfig;
055
056 import javax.servlet.ServletException;
057 import javax.servlet.http.HttpServletRequest;
058 import javax.servlet.http.HttpServletResponse;
059
060 import org.apache.struts.action.ActionForm;
061 import org.apache.struts.action.ActionForward;
062 import org.apache.struts.action.ActionMapping;
063
064
070 public class GetFileAction extends PortletAction {
071
072 @Override
073 public void processAction(
074 ActionMapping actionMapping, ActionForm actionForm,
075 PortletConfig portletConfig, ActionRequest actionRequest,
076 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 actionMapping, ActionForm actionForm,
128 HttpServletRequest request, 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
257 String fileName = fileVersion.getTitle();
258
259 String sourceExtension = fileVersion.getExtension();
260
261 if (Validator.isNotNull(sourceExtension) &&
262 !fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
263
264 fileName += StringPool.PERIOD + sourceExtension;
265 }
266
267 long contentLength = fileVersion.getSize();
268 String contentType = fileVersion.getMimeType();
269
270 if (Validator.isNotNull(targetExtension)) {
271 String id = DLUtil.getTempFileId(
272 fileEntry.getFileEntryId(), version);
273
274 File convertedFile = DocumentConversionUtil.convert(
275 id, is, sourceExtension, targetExtension);
276
277 if (convertedFile != null) {
278 fileName = FileUtil.stripExtension(fileName).concat(
279 StringPool.PERIOD).concat(targetExtension);
280 is = new FileInputStream(convertedFile);
281 contentLength = convertedFile.length();
282 contentType = MimeTypesUtil.getContentType(fileName);
283 }
284 }
285
286 ServletResponseUtil.sendFile(
287 request, response, fileName, is, contentLength, contentType);
288 }
289
290 @Override
291 protected boolean isCheckMethodOnProcessAction() {
292 return _CHECK_METHOD_ON_PROCESS_ACTION;
293 }
294
295 protected void processPrincipalException(
296 Throwable t, HttpServletRequest request,
297 HttpServletResponse response)
298 throws IOException, ServletException {
299
300 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
301 WebKeys.THEME_DISPLAY);
302
303 PermissionChecker permissionChecker =
304 themeDisplay.getPermissionChecker();
305
306 User user = permissionChecker.getUser();
307
308 if ((user != null) && !user.isDefaultUser()) {
309 PortalUtil.sendError(
310 HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
311 response);
312
313 return;
314 }
315
316 String redirect = PortalUtil.getPathMain() + "/portal/login";
317
318 String currentURL = PortalUtil.getCurrentURL(request);
319
320 redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
321
322 response.sendRedirect(redirect);
323 }
324
325 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
326
327 }