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 "{fileEntryId=" + fileEntryId + "}");
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 = PortalUtil.getPathMain() + "/portal/login";
318
319 String currentURL = PortalUtil.getCurrentURL(request);
320
321 redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
322
323 response.sendRedirect(redirect);
324 }
325
326 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
327
328 }