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.PermissionChecker;
030 import com.liferay.portal.service.UserLocalServiceUtil;
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.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 mapping, ActionForm form, PortletConfig portletConfig,
075 ActionRequest actionRequest, ActionResponse actionResponse)
076 throws Exception {
077
078 HttpServletRequest request = PortalUtil.getHttpServletRequest(
079 actionRequest);
080 HttpServletResponse response = PortalUtil.getHttpServletResponse(
081 actionResponse);
082
083 try {
084 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
085
086 long folderId = ParamUtil.getLong(actionRequest, "folderId");
087 String name = ParamUtil.getString(actionRequest, "name");
088 String title = ParamUtil.getString(actionRequest, "title");
089 String version = ParamUtil.getString(actionRequest, "version");
090
091 long fileShortcutId = ParamUtil.getLong(
092 actionRequest, "fileShortcutId");
093
094 String uuid = ParamUtil.getString(actionRequest, "uuid");
095
096 String targetExtension = ParamUtil.getString(
097 actionRequest, "targetExtension");
098
099 ThemeDisplay themeDisplay =
100 (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
101
102 long groupId = ParamUtil.getLong(
103 actionRequest, "groupId", themeDisplay.getScopeGroupId());
104
105 getFile(
106 fileEntryId, folderId, name, title, version, fileShortcutId,
107 uuid, groupId, targetExtension, request, response);
108
109 setForward(actionRequest, ActionConstants.COMMON_NULL);
110 }
111 catch (NoSuchFileEntryException nsfee) {
112 PortalUtil.sendError(
113 HttpServletResponse.SC_NOT_FOUND, nsfee, actionRequest,
114 actionResponse);
115 }
116 catch (PrincipalException pe) {
117 processPrincipalException(pe, request, response);
118 }
119 catch (Exception e) {
120 PortalUtil.sendError(e, actionRequest, actionResponse);
121 }
122 }
123
124 @Override
125 public ActionForward strutsExecute(
126 ActionMapping mapping, ActionForm form, HttpServletRequest request,
127 HttpServletResponse response)
128 throws Exception {
129
130 try {
131 long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
132
133 long folderId = ParamUtil.getLong(request, "folderId");
134 String name = ParamUtil.getString(request, "name");
135 String title = ParamUtil.getString(request, "title");
136 String version = ParamUtil.getString(request, "version");
137
138 long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
139
140 String uuid = ParamUtil.getString(request, "uuid");
141
142 String targetExtension = ParamUtil.getString(
143 request, "targetExtension");
144
145 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
146 WebKeys.THEME_DISPLAY);
147
148 long groupId = ParamUtil.getLong(
149 request, "groupId", themeDisplay.getScopeGroupId());
150
151 getFile(
152 fileEntryId, folderId, name, title, version, fileShortcutId,
153 uuid, groupId, targetExtension, request, response);
154
155 return null;
156 }
157 catch (PrincipalException pe) {
158 processPrincipalException(pe, request, response);
159
160 return null;
161 }
162 catch (Exception e) {
163 PortalUtil.sendError(e, request, response);
164
165 return null;
166 }
167 }
168
169 protected void getFile(
170 long fileEntryId, long folderId, String name, String title,
171 String version, long fileShortcutId, String uuid, long groupId,
172 String targetExtension, HttpServletRequest request,
173 HttpServletResponse response)
174 throws Exception {
175
176 if (name.startsWith("DLFE-")) {
177 name = name.substring(5);
178 }
179
180 name = FileUtil.stripExtension(name);
181
182 FileEntry fileEntry = null;
183
184 if (Validator.isNotNull(uuid) && (groupId > 0)) {
185 fileEntry = DLAppServiceUtil.getFileEntryByUuidAndGroupId(
186 uuid, groupId);
187
188 folderId = fileEntry.getFolderId();
189 }
190
191 if (fileEntryId > 0) {
192 fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
193 }
194 else if (fileShortcutId <= 0) {
195 if (Validator.isNotNull(title)) {
196 fileEntry = DLAppServiceUtil.getFileEntry(
197 groupId, folderId, title);
198 }
199 else if (Validator.isNotNull(name)) {
200 DLFileEntry dlFileEntry =
201 DLFileEntryLocalServiceUtil.fetchFileEntryByName(
202 groupId, folderId, name);
203
204 if (dlFileEntry == null) {
205
206
207
208 List<DLFileEntry> dlFileEntries =
209 DLFileEntryLocalServiceUtil.getFileEntries(
210 folderId, name);
211
212 if (!dlFileEntries.isEmpty()) {
213 dlFileEntry = dlFileEntries.get(0);
214 }
215 }
216
217 if (dlFileEntry != null) {
218 fileEntry = new LiferayFileEntry(dlFileEntry);
219 }
220 }
221 }
222 else {
223 DLFileShortcut fileShortcut = DLAppServiceUtil.getFileShortcut(
224 fileShortcutId);
225
226 fileEntryId = fileShortcut.getToFileEntryId();
227
228 fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
229 }
230
231 if (Validator.isNull(version)) {
232 if (Validator.isNotNull(fileEntry.getVersion())) {
233 version = fileEntry.getVersion();
234 }
235 else {
236 throw new NoSuchFileEntryException();
237 }
238 }
239
240 FileVersion fileVersion = fileEntry.getFileVersion(version);
241
242 InputStream is = fileVersion.getContentStream(true);
243 String fileName = fileVersion.getTitle();
244 long contentLength = fileVersion.getSize();
245 String contentType = fileVersion.getMimeType();
246
247 if (Validator.isNotNull(targetExtension)) {
248 String id = DLUtil.getTempFileId(
249 fileEntry.getFileEntryId(), version);
250
251 String sourceExtension = fileVersion.getExtension();
252
253 if (!fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
254 fileName += StringPool.PERIOD + sourceExtension;
255 }
256
257 File convertedFile = DocumentConversionUtil.convert(
258 id, is, sourceExtension, targetExtension);
259
260 if (convertedFile != null) {
261 fileName = FileUtil.stripExtension(fileName).concat(
262 StringPool.PERIOD).concat(targetExtension);
263 is = new FileInputStream(convertedFile);
264 contentLength = convertedFile.length();
265 contentType = MimeTypesUtil.getContentType(fileName);
266 }
267 }
268
269 ServletResponseUtil.sendFile(
270 request, response, fileName, is, contentLength, contentType);
271 }
272
273 @Override
274 protected boolean isCheckMethodOnProcessAction() {
275 return _CHECK_METHOD_ON_PROCESS_ACTION;
276 }
277
278 protected void processPrincipalException(
279 Throwable t, HttpServletRequest request,
280 HttpServletResponse response)
281 throws IOException, ServletException {
282
283 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
284 WebKeys.THEME_DISPLAY);
285
286 PermissionChecker permissionChecker =
287 themeDisplay.getPermissionChecker();
288
289 long userId = permissionChecker.getUserId();
290
291 User user = null;
292
293 try {
294 user = UserLocalServiceUtil.getUser(userId);
295 }
296 catch (Exception e) {
297 }
298
299 if ((user != null) && !user.isDefaultUser()) {
300 PortalUtil.sendError(
301 HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
302 response);
303
304 return;
305 }
306
307 String redirect =
308 request.getContextPath() + Portal.PATH_MAIN + "/portal/login";
309
310 String currentURL = PortalUtil.getCurrentURL(request);
311
312 redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
313
314 response.sendRedirect(redirect);
315 }
316
317 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
318
319 }