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.security.auth.PrincipalException;
028 import com.liferay.portal.security.permission.PermissionChecker;
029 import com.liferay.portal.service.UserLocalServiceUtil;
030 import com.liferay.portal.struts.ActionConstants;
031 import com.liferay.portal.struts.PortletAction;
032 import com.liferay.portal.theme.ThemeDisplay;
033 import com.liferay.portal.util.Portal;
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.DLFileShortcut;
038 import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
039 import com.liferay.portlet.documentlibrary.util.DLUtil;
040 import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
041
042 import java.io.File;
043 import java.io.FileInputStream;
044 import java.io.IOException;
045 import java.io.InputStream;
046
047 import javax.portlet.ActionRequest;
048 import javax.portlet.ActionResponse;
049 import javax.portlet.PortletConfig;
050
051 import javax.servlet.ServletException;
052 import javax.servlet.http.HttpServletRequest;
053 import javax.servlet.http.HttpServletResponse;
054
055 import org.apache.struts.action.ActionForm;
056 import org.apache.struts.action.ActionForward;
057 import org.apache.struts.action.ActionMapping;
058
059
065 public class GetFileAction extends PortletAction {
066
067 @Override
068 public void processAction(
069 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
070 ActionRequest actionRequest, ActionResponse actionResponse)
071 throws Exception {
072
073 HttpServletRequest request = PortalUtil.getHttpServletRequest(
074 actionRequest);
075 HttpServletResponse response = PortalUtil.getHttpServletResponse(
076 actionResponse);
077
078 try {
079 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
080
081 long folderId = ParamUtil.getLong(actionRequest, "folderId");
082 String title = ParamUtil.getString(actionRequest, "title");
083 String version = ParamUtil.getString(actionRequest, "version");
084
085 long fileShortcutId = ParamUtil.getLong(
086 actionRequest, "fileShortcutId");
087
088 String uuid = ParamUtil.getString(actionRequest, "uuid");
089
090 String targetExtension = ParamUtil.getString(
091 actionRequest, "targetExtension");
092
093 ThemeDisplay themeDisplay =
094 (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
095
096 long groupId = ParamUtil.getLong(
097 actionRequest, "groupId", themeDisplay.getScopeGroupId());
098
099 getFile(
100 fileEntryId, folderId, title, version, fileShortcutId, uuid,
101 groupId, targetExtension, themeDisplay, request, response);
102
103 setForward(actionRequest, ActionConstants.COMMON_NULL);
104 }
105 catch (NoSuchFileEntryException nsfee) {
106 PortalUtil.sendError(
107 HttpServletResponse.SC_NOT_FOUND, nsfee, actionRequest,
108 actionResponse);
109 }
110 catch (PrincipalException pe) {
111 processPrincipalException(pe, request, response);
112 }
113 catch (Exception e) {
114 PortalUtil.sendError(e, actionRequest, actionResponse);
115 }
116 }
117
118 @Override
119 public ActionForward strutsExecute(
120 ActionMapping mapping, ActionForm form, HttpServletRequest request,
121 HttpServletResponse response)
122 throws Exception {
123
124 try {
125 long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
126
127 long folderId = ParamUtil.getLong(request, "folderId");
128 String title = ParamUtil.getString(request, "title");
129 String version = ParamUtil.getString(request, "version");
130
131 long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
132
133 String uuid = ParamUtil.getString(request, "uuid");
134
135 String targetExtension = ParamUtil.getString(
136 request, "targetExtension");
137
138 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
139 WebKeys.THEME_DISPLAY);
140
141 long groupId = ParamUtil.getLong(
142 request, "groupId", themeDisplay.getScopeGroupId());
143
144 getFile(
145 fileEntryId, folderId, title, version, fileShortcutId, uuid,
146 groupId, targetExtension, themeDisplay, request, response);
147
148 return null;
149 }
150 catch (PrincipalException pe) {
151 processPrincipalException(pe, request, response);
152
153 return null;
154 }
155 catch (Exception e) {
156 PortalUtil.sendError(e, request, response);
157
158 return null;
159 }
160 }
161
162 protected void getFile(
163 long fileEntryId, long folderId, String title, String version,
164 long fileShortcutId, String uuid, long groupId,
165 String targetExtension, ThemeDisplay themeDisplay,
166 HttpServletRequest request, HttpServletResponse response)
167 throws Exception {
168
169 FileEntry fileEntry = null;
170
171 if (Validator.isNotNull(uuid) && (groupId > 0)) {
172 fileEntry = DLAppServiceUtil.getFileEntryByUuidAndGroupId(
173 uuid, groupId);
174
175 folderId = fileEntry.getFolderId();
176 }
177
178 if (fileEntryId > 0) {
179 fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
180 }
181 else if (fileShortcutId <= 0) {
182 if (Validator.isNotNull(title)) {
183 fileEntry = DLAppServiceUtil.getFileEntry(
184 groupId, folderId, title);
185 }
186 }
187 else {
188 DLFileShortcut fileShortcut = DLAppServiceUtil.getFileShortcut(
189 fileShortcutId);
190
191 fileEntryId = fileShortcut.getToFileEntryId();
192
193 fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
194 }
195
196 if (Validator.isNull(version)) {
197 if (Validator.isNotNull(fileEntry.getVersion())) {
198 version = fileEntry.getVersion();
199 }
200 else {
201 throw new NoSuchFileEntryException();
202 }
203 }
204
205 FileVersion fileVersion = fileEntry.getFileVersion(version);
206
207 InputStream is = fileVersion.getContentStream(true);
208 String fileName = fileVersion.getTitle();
209 long contentLength = fileVersion.getSize();
210 String contentType = fileVersion.getMimeType();
211
212 if (Validator.isNotNull(targetExtension)) {
213 String id = DLUtil.getTempFileId(
214 fileEntry.getFileEntryId(), version);
215
216 String sourceExtension = fileVersion.getExtension();
217
218 if (!fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
219 fileName += StringPool.PERIOD + sourceExtension;
220 }
221
222 File convertedFile = DocumentConversionUtil.convert(
223 id, is, sourceExtension, targetExtension);
224
225 if (convertedFile != null) {
226 fileName = FileUtil.stripExtension(fileName).concat(
227 StringPool.PERIOD).concat(targetExtension);
228 is = new FileInputStream(convertedFile);
229 contentLength = convertedFile.length();
230 contentType = MimeTypesUtil.getContentType(fileName);
231 }
232 }
233
234 ServletResponseUtil.sendFile(
235 request, response, fileName, is, contentLength, contentType);
236 }
237
238 @Override
239 protected boolean isCheckMethodOnProcessAction() {
240 return _CHECK_METHOD_ON_PROCESS_ACTION;
241 }
242
243 protected void processPrincipalException(
244 Throwable t, HttpServletRequest request,
245 HttpServletResponse response)
246 throws IOException, ServletException {
247
248 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
249 WebKeys.THEME_DISPLAY);
250
251 PermissionChecker permissionChecker =
252 themeDisplay.getPermissionChecker();
253
254 long userId = permissionChecker.getUserId();
255
256 User user = null;
257
258 try {
259 user = UserLocalServiceUtil.getUser(userId);
260 }
261 catch (Exception e) {
262 }
263
264 if ((user != null) && !user.isDefaultUser()) {
265 PortalUtil.sendError(
266 HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
267 response);
268
269 return;
270 }
271
272 String redirect =
273 request.getContextPath() + Portal.PATH_MAIN + "/portal/login";
274
275 String currentURL = PortalUtil.getCurrentURL(request);
276
277 redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
278
279 response.sendRedirect(redirect);
280 }
281
282 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
283
284 }