001
014
015 package com.liferay.portlet.documentselector.action;
016
017 import com.liferay.portal.NoSuchRepositoryEntryException;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.repository.model.FileEntry;
020 import com.liferay.portal.kernel.repository.model.Folder;
021 import com.liferay.portal.kernel.servlet.SessionErrors;
022 import com.liferay.portal.kernel.upload.LiferayFileItemException;
023 import com.liferay.portal.kernel.upload.UploadException;
024 import com.liferay.portal.kernel.upload.UploadPortletRequest;
025 import com.liferay.portal.kernel.util.ArrayUtil;
026 import com.liferay.portal.kernel.util.MimeTypesUtil;
027 import com.liferay.portal.kernel.util.ParamUtil;
028 import com.liferay.portal.kernel.util.StreamUtil;
029 import com.liferay.portal.kernel.util.Validator;
030 import com.liferay.portal.security.auth.PrincipalException;
031 import com.liferay.portal.service.ServiceContext;
032 import com.liferay.portal.service.ServiceContextFactory;
033 import com.liferay.portal.struts.PortletAction;
034 import com.liferay.portal.theme.ThemeDisplay;
035 import com.liferay.portal.util.PortalUtil;
036 import com.liferay.portal.util.WebKeys;
037 import com.liferay.portlet.asset.AssetCategoryException;
038 import com.liferay.portlet.asset.AssetTagException;
039 import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
040 import com.liferay.portlet.documentlibrary.DuplicateFileException;
041 import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
042 import com.liferay.portlet.documentlibrary.FileExtensionException;
043 import com.liferay.portlet.documentlibrary.FileMimeTypeException;
044 import com.liferay.portlet.documentlibrary.FileNameException;
045 import com.liferay.portlet.documentlibrary.FileSizeException;
046 import com.liferay.portlet.documentlibrary.InvalidFileVersionException;
047 import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
048 import com.liferay.portlet.documentlibrary.NoSuchFileVersionException;
049 import com.liferay.portlet.documentlibrary.NoSuchFolderException;
050 import com.liferay.portlet.documentlibrary.SourceFileNameException;
051 import com.liferay.portlet.documentlibrary.action.ActionUtil;
052 import com.liferay.portlet.documentlibrary.antivirus.AntivirusScannerException;
053 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
054 import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
055 import com.liferay.portlet.documentselector.util.DocumentSelectorUtil;
056 import com.liferay.portlet.dynamicdatamapping.StorageFieldRequiredException;
057
058 import java.io.InputStream;
059
060 import javax.portlet.ActionRequest;
061 import javax.portlet.ActionResponse;
062 import javax.portlet.PortletConfig;
063 import javax.portlet.RenderRequest;
064 import javax.portlet.RenderResponse;
065
066 import javax.servlet.http.HttpServletRequest;
067
068 import org.apache.struts.action.ActionForm;
069 import org.apache.struts.action.ActionForward;
070 import org.apache.struts.action.ActionMapping;
071
072
075 public class EditFileEntryAction extends PortletAction {
076
077 @Override
078 public void processAction(
079 ActionMapping actionMapping, ActionForm actionForm,
080 PortletConfig portletConfig, ActionRequest actionRequest,
081 ActionResponse actionResponse)
082 throws Exception {
083
084 try {
085 UploadException uploadException =
086 (UploadException)actionRequest.getAttribute(
087 WebKeys.UPLOAD_EXCEPTION);
088
089 if (uploadException != null) {
090 if (uploadException.isExceededLiferayFileItemSizeLimit()) {
091 throw new LiferayFileItemException();
092 }
093 else if (uploadException.isExceededSizeLimit()) {
094 throw new FileSizeException(uploadException.getCause());
095 }
096
097 throw new PortalException(uploadException.getCause());
098 }
099 else {
100 addFileEntry(actionRequest);
101 }
102
103 String redirect = PortalUtil.escapeRedirect(
104 ParamUtil.getString(actionRequest, "redirect"));
105
106 if (Validator.isNotNull(redirect)) {
107 actionResponse.sendRedirect(redirect);
108 }
109 }
110 catch (Exception e) {
111 handleUploadException(actionRequest, actionResponse, e);
112 }
113 }
114
115 @Override
116 public ActionForward render(
117 ActionMapping actionMapping, ActionForm actionForm,
118 PortletConfig portletConfig, RenderRequest renderRequest,
119 RenderResponse renderResponse)
120 throws Exception {
121
122 try {
123 ActionUtil.getFileEntry(renderRequest);
124 }
125 catch (Exception e) {
126 if (e instanceof NoSuchFileEntryException ||
127 e instanceof NoSuchFileVersionException ||
128 e instanceof NoSuchRepositoryEntryException ||
129 e instanceof PrincipalException) {
130
131 SessionErrors.add(renderRequest, e.getClass());
132
133 return actionMapping.findForward(
134 "portlet.document_selector.error");
135 }
136 else {
137 throw e;
138 }
139 }
140
141 String forward = "portlet.document_selector.add_file_entry";
142
143 return actionMapping.findForward(getForward(renderRequest, forward));
144 }
145
146 protected FileEntry addFileEntry(ActionRequest actionRequest)
147 throws Exception {
148
149 UploadPortletRequest uploadPortletRequest =
150 PortalUtil.getUploadPortletRequest(actionRequest);
151
152 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
153 WebKeys.THEME_DISPLAY);
154
155 long folderId = ParamUtil.getLong(uploadPortletRequest, "folderId");
156 String sourceFileName = uploadPortletRequest.getFileName("file");
157 String title = ParamUtil.getString(uploadPortletRequest, "title");
158 String description = ParamUtil.getString(
159 uploadPortletRequest, "description");
160 String changeLog = ParamUtil.getString(
161 uploadPortletRequest, "changeLog");
162
163 if (folderId > 0) {
164 Folder folder = DLAppServiceUtil.getFolder(folderId);
165
166 if (folder.getGroupId() != themeDisplay.getScopeGroupId()) {
167 throw new NoSuchFolderException("{folderId=" + folderId + "}");
168 }
169 }
170
171 InputStream inputStream = null;
172
173 try {
174 String contentType = uploadPortletRequest.getContentType("file");
175
176 long size = uploadPortletRequest.getSize("file");
177
178 if (size == 0) {
179 contentType = MimeTypesUtil.getContentType(title);
180 }
181
182 if (size > 0) {
183 HttpServletRequest request = PortalUtil.getHttpServletRequest(
184 actionRequest);
185
186 String[] mimeTypes = DocumentSelectorUtil.getMimeTypes(request);
187
188 if (ArrayUtil.isNotEmpty(mimeTypes) &&
189 !ArrayUtil.contains(mimeTypes, contentType)) {
190
191 throw new FileMimeTypeException(contentType);
192 }
193 }
194
195 inputStream = uploadPortletRequest.getFileAsStream("file");
196
197 ServiceContext serviceContext = ServiceContextFactory.getInstance(
198 DLFileEntry.class.getName(), uploadPortletRequest);
199
200 FileEntry fileEntry = DLAppServiceUtil.addFileEntry(
201 themeDisplay.getScopeGroupId(), folderId, sourceFileName,
202 contentType, title, description, changeLog, inputStream, size,
203 serviceContext);
204
205 AssetPublisherUtil.addRecentFolderId(
206 actionRequest, DLFileEntry.class.getName(), folderId);
207
208 return fileEntry;
209 }
210 catch (Exception e) {
211 UploadException uploadException =
212 (UploadException)actionRequest.getAttribute(
213 WebKeys.UPLOAD_EXCEPTION);
214
215 if (uploadException != null) {
216 if (uploadException.isExceededLiferayFileItemSizeLimit()) {
217 throw new LiferayFileItemException();
218 }
219 else if (uploadException.isExceededSizeLimit()) {
220 throw new FileSizeException(uploadException.getCause());
221 }
222 }
223
224 throw e;
225 }
226 finally {
227 StreamUtil.cleanUp(inputStream);
228 }
229 }
230
231 protected void handleUploadException(
232 ActionRequest actionRequest, ActionResponse actionResponse,
233 Exception e)
234 throws Exception {
235
236 if (e instanceof AssetCategoryException ||
237 e instanceof AssetTagException) {
238
239 SessionErrors.add(actionRequest, e.getClass(), e);
240 }
241 else if (e instanceof AntivirusScannerException ||
242 e instanceof DuplicateFileException ||
243 e instanceof DuplicateFolderNameException ||
244 e instanceof FileExtensionException ||
245 e instanceof FileMimeTypeException ||
246 e instanceof FileNameException ||
247 e instanceof FileSizeException ||
248 e instanceof LiferayFileItemException ||
249 e instanceof NoSuchFolderException ||
250 e instanceof SourceFileNameException ||
251 e instanceof StorageFieldRequiredException) {
252
253 UploadException uploadException =
254 (UploadException)actionRequest.getAttribute(
255 WebKeys.UPLOAD_EXCEPTION);
256
257 if (uploadException != null) {
258 String uploadExceptionRedirect = ParamUtil.getString(
259 actionRequest, "uploadExceptionRedirect");
260
261 actionResponse.sendRedirect(uploadExceptionRedirect);
262
263 SessionErrors.add(actionRequest, e.getClass());
264
265 return;
266 }
267
268 if (e instanceof AntivirusScannerException) {
269 SessionErrors.add(actionRequest, e.getClass(), e);
270 }
271 else {
272 SessionErrors.add(actionRequest, e.getClass());
273 }
274 }
275 else if (e instanceof InvalidFileVersionException ||
276 e instanceof NoSuchFileEntryException ||
277 e instanceof PrincipalException) {
278
279 SessionErrors.add(actionRequest, e.getClass());
280
281 setForward(actionRequest, "portlet.document_library.error");
282 }
283 else {
284 throw e;
285 }
286 }
287
288 }