001
014
015 package com.liferay.portlet.documentlibrary.action;
016
017 import com.liferay.portal.DuplicateLockException;
018 import com.liferay.portal.NoSuchRepositoryEntryException;
019 import com.liferay.portal.kernel.exception.PortalException;
020 import com.liferay.portal.kernel.json.JSONArray;
021 import com.liferay.portal.kernel.json.JSONFactoryUtil;
022 import com.liferay.portal.kernel.json.JSONObject;
023 import com.liferay.portal.kernel.language.LanguageUtil;
024 import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
025 import com.liferay.portal.kernel.portlet.LiferayWindowState;
026 import com.liferay.portal.kernel.repository.model.FileEntry;
027 import com.liferay.portal.kernel.repository.model.Folder;
028 import com.liferay.portal.kernel.servlet.ServletResponseConstants;
029 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
030 import com.liferay.portal.kernel.servlet.SessionErrors;
031 import com.liferay.portal.kernel.servlet.SessionMessages;
032 import com.liferay.portal.kernel.upload.UploadException;
033 import com.liferay.portal.kernel.upload.UploadPortletRequest;
034 import com.liferay.portal.kernel.util.Constants;
035 import com.liferay.portal.kernel.util.ContentTypes;
036 import com.liferay.portal.kernel.util.KeyValuePair;
037 import com.liferay.portal.kernel.util.MimeTypesUtil;
038 import com.liferay.portal.kernel.util.ParamUtil;
039 import com.liferay.portal.kernel.util.PropsKeys;
040 import com.liferay.portal.kernel.util.StreamUtil;
041 import com.liferay.portal.kernel.util.StringPool;
042 import com.liferay.portal.kernel.util.StringUtil;
043 import com.liferay.portal.kernel.util.TempFileUtil;
044 import com.liferay.portal.kernel.util.Validator;
045 import com.liferay.portal.security.auth.PrincipalException;
046 import com.liferay.portal.service.ServiceContext;
047 import com.liferay.portal.service.ServiceContextFactory;
048 import com.liferay.portal.struts.ActionConstants;
049 import com.liferay.portal.struts.PortletAction;
050 import com.liferay.portal.theme.ThemeDisplay;
051 import com.liferay.portal.util.PortalUtil;
052 import com.liferay.portal.util.PortletKeys;
053 import com.liferay.portal.util.PrefsPropsUtil;
054 import com.liferay.portal.util.WebKeys;
055 import com.liferay.portlet.PortletPreferencesFactoryUtil;
056 import com.liferay.portlet.asset.AssetCategoryException;
057 import com.liferay.portlet.asset.AssetTagException;
058 import com.liferay.portlet.asset.model.AssetVocabulary;
059 import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
060 import com.liferay.portlet.documentlibrary.DuplicateFileException;
061 import com.liferay.portlet.documentlibrary.DuplicateFolderNameException;
062 import com.liferay.portlet.documentlibrary.FileExtensionException;
063 import com.liferay.portlet.documentlibrary.FileMimeTypeException;
064 import com.liferay.portlet.documentlibrary.FileNameException;
065 import com.liferay.portlet.documentlibrary.FileSizeException;
066 import com.liferay.portlet.documentlibrary.InvalidFileEntryTypeException;
067 import com.liferay.portlet.documentlibrary.InvalidFileVersionException;
068 import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
069 import com.liferay.portlet.documentlibrary.NoSuchFileVersionException;
070 import com.liferay.portlet.documentlibrary.NoSuchFolderException;
071 import com.liferay.portlet.documentlibrary.SourceFileNameException;
072 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
073 import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
074 import com.liferay.portlet.documentlibrary.util.DLUtil;
075 import com.liferay.portlet.dynamicdatamapping.StorageFieldRequiredException;
076
077 import java.io.InputStream;
078
079 import java.util.ArrayList;
080 import java.util.Arrays;
081 import java.util.HashMap;
082 import java.util.List;
083 import java.util.Map;
084
085 import javax.portlet.ActionRequest;
086 import javax.portlet.ActionResponse;
087 import javax.portlet.PortletConfig;
088 import javax.portlet.PortletContext;
089 import javax.portlet.PortletPreferences;
090 import javax.portlet.PortletRequestDispatcher;
091 import javax.portlet.RenderRequest;
092 import javax.portlet.RenderResponse;
093 import javax.portlet.ResourceRequest;
094 import javax.portlet.ResourceResponse;
095 import javax.portlet.WindowState;
096
097 import javax.servlet.http.HttpServletResponse;
098
099 import org.apache.commons.fileupload.FileUploadBase.IOFileUploadException;
100 import org.apache.struts.action.ActionForm;
101 import org.apache.struts.action.ActionForward;
102 import org.apache.struts.action.ActionMapping;
103
104
111 public class EditFileEntryAction extends PortletAction {
112
113 @Override
114 public void processAction(
115 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
116 ActionRequest actionRequest, ActionResponse actionResponse)
117 throws Exception {
118
119 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
120
121 try {
122 if (Validator.isNull(cmd)) {
123 UploadException uploadException =
124 (UploadException)actionRequest.getAttribute(
125 WebKeys.UPLOAD_EXCEPTION);
126
127 if (uploadException != null) {
128 if (uploadException.isExceededSizeLimit()) {
129 throw new FileSizeException(uploadException.getCause());
130 }
131
132 throw new PortalException(uploadException.getCause());
133 }
134 }
135 else if (cmd.equals(Constants.ADD) ||
136 cmd.equals(Constants.UPDATE) ||
137 cmd.equals(Constants.UPDATE_AND_CHECKIN)) {
138
139 updateFileEntry(portletConfig, actionRequest, actionResponse);
140 }
141 else if (cmd.equals(Constants.ADD_MULTIPLE)) {
142 addMultipleFileEntries(actionRequest, actionResponse);
143 }
144 else if (cmd.equals(Constants.ADD_TEMP)) {
145 addTempFileEntry(actionRequest);
146 }
147 else if (cmd.equals(Constants.DELETE)) {
148 deleteFileEntry(
149 (LiferayPortletConfig)portletConfig, actionRequest, false);
150 }
151 else if (cmd.equals(Constants.DELETE_TEMP)) {
152 deleteTempFileEntry(actionRequest, actionResponse);
153 }
154 else if (cmd.equals(Constants.CANCEL_CHECKOUT)) {
155 cancelFileEntriesCheckOut(actionRequest);
156 }
157 else if (cmd.equals(Constants.CHECKIN)) {
158 checkInFileEntries(actionRequest);
159 }
160 else if (cmd.equals(Constants.CHECKOUT)) {
161 checkOutFileEntries(actionRequest);
162 }
163 else if (cmd.equals(Constants.MOVE)) {
164 moveFileEntries(actionRequest, false);
165 }
166 else if (cmd.equals(Constants.MOVE_FROM_TRASH)) {
167 moveFileEntries(actionRequest, true);
168 }
169 else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
170 deleteFileEntry(
171 (LiferayPortletConfig)portletConfig, actionRequest, true);
172 }
173 else if (cmd.equals(Constants.REVERT)) {
174 revertFileEntry(actionRequest);
175 }
176
177 WindowState windowState = actionRequest.getWindowState();
178
179 if (cmd.equals(Constants.ADD_TEMP) ||
180 cmd.equals(Constants.DELETE_TEMP)) {
181
182 setForward(actionRequest, ActionConstants.COMMON_NULL);
183 }
184 else if (cmd.equals(Constants.PREVIEW)) {
185 }
186 else if (!cmd.equals(Constants.MOVE_FROM_TRASH) &&
187 !windowState.equals(LiferayWindowState.POP_UP)) {
188
189 sendRedirect(actionRequest, actionResponse);
190 }
191 else {
192 String redirect = PortalUtil.escapeRedirect(
193 ParamUtil.getString(actionRequest, "redirect"));
194
195 if (Validator.isNotNull(redirect)) {
196 actionResponse.sendRedirect(redirect);
197 }
198 }
199 }
200 catch (Exception e) {
201 handleUploadException(actionRequest, actionResponse, cmd, e);
202 }
203 }
204
205 @Override
206 public ActionForward render(
207 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
208 RenderRequest renderRequest, RenderResponse renderResponse)
209 throws Exception {
210
211 try {
212 ActionUtil.getFileEntry(renderRequest);
213 }
214 catch (Exception e) {
215 if (e instanceof NoSuchFileEntryException ||
216 e instanceof NoSuchFileVersionException ||
217 e instanceof NoSuchRepositoryEntryException ||
218 e instanceof PrincipalException) {
219
220 SessionErrors.add(renderRequest, e.getClass());
221
222 return mapping.findForward("portlet.document_library.error");
223 }
224 else {
225 throw e;
226 }
227 }
228
229 String forward = "portlet.document_library.edit_file_entry";
230
231 return mapping.findForward(getForward(renderRequest, forward));
232 }
233
234 @Override
235 public void serveResource(
236 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
237 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
238 throws Exception {
239
240 PortletContext portletContext = portletConfig.getPortletContext();
241
242 PortletRequestDispatcher portletRequestDispatcher =
243 portletContext.getRequestDispatcher(
244 "/html/portlet/document_library/" +
245 "upload_multiple_file_entries_resources.jsp");
246
247 portletRequestDispatcher.include(resourceRequest, resourceResponse);
248 }
249
250 protected void addMultipleFileEntries(
251 ActionRequest actionRequest, ActionResponse actionResponse)
252 throws Exception {
253
254 List<String> validFileNames = new ArrayList<String>();
255 List<KeyValuePair> invalidFileNameKVPs = new ArrayList<KeyValuePair>();
256
257 String[] selectedFileNames = ParamUtil.getParameterValues(
258 actionRequest, "selectedFileName");
259
260 for (String selectedFileName : selectedFileNames) {
261 addMultipleFileEntries(
262 actionRequest, actionResponse, selectedFileName, validFileNames,
263 invalidFileNameKVPs);
264 }
265
266 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
267
268 for (String validFileName : validFileNames) {
269 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
270
271 jsonObject.put("added", Boolean.TRUE);
272 jsonObject.put("fileName", validFileName);
273
274 jsonArray.put(jsonObject);
275 }
276
277 for (KeyValuePair invalidFileNameKVP : invalidFileNameKVPs) {
278 String fileName = invalidFileNameKVP.getKey();
279 String errorMessage = invalidFileNameKVP.getValue();
280
281 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
282
283 jsonObject.put("added", Boolean.FALSE);
284 jsonObject.put("errorMessage", errorMessage);
285 jsonObject.put("fileName", fileName);
286
287 jsonArray.put(jsonObject);
288 }
289
290 writeJSON(actionRequest, actionResponse, jsonArray);
291 }
292
293 protected void addMultipleFileEntries(
294 ActionRequest actionRequest, ActionResponse actionResponse,
295 String selectedFileName, List<String> validFileNames,
296 List<KeyValuePair> invalidFileNameKVPs)
297 throws Exception {
298
299 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
300 WebKeys.THEME_DISPLAY);
301
302 long repositoryId = ParamUtil.getLong(actionRequest, "repositoryId");
303 long folderId = ParamUtil.getLong(actionRequest, "folderId");
304 String contentType = MimeTypesUtil.getContentType(selectedFileName);
305 String description = ParamUtil.getString(actionRequest, "description");
306 String changeLog = ParamUtil.getString(actionRequest, "changeLog");
307
308 String tempFileName = TempFileUtil.getTempFileName(
309 themeDisplay.getUserId(), selectedFileName, _TEMP_FOLDER_NAME);
310
311 try {
312 InputStream inputStream = TempFileUtil.getTempFileAsStream(
313 tempFileName);
314 long size = TempFileUtil.getTempFileSize(tempFileName);
315
316 ServiceContext serviceContext = ServiceContextFactory.getInstance(
317 DLFileEntry.class.getName(), actionRequest);
318
319 FileEntry fileEntry = DLAppServiceUtil.addFileEntry(
320 repositoryId, folderId, selectedFileName, contentType,
321 selectedFileName, description, changeLog, inputStream, size,
322 serviceContext);
323
324 AssetPublisherUtil.addAndStoreSelection(
325 actionRequest, DLFileEntry.class.getName(),
326 fileEntry.getFileEntryId(), -1);
327
328 AssetPublisherUtil.addRecentFolderId(
329 actionRequest, DLFileEntry.class.getName(), folderId);
330
331 validFileNames.add(selectedFileName);
332
333 return;
334 }
335 catch (Exception e) {
336 String errorMessage = getAddMultipleFileEntriesErrorMessage(
337 themeDisplay, e);
338
339 invalidFileNameKVPs.add(
340 new KeyValuePair(selectedFileName, errorMessage));
341 }
342 finally {
343 TempFileUtil.deleteTempFile(tempFileName);
344 }
345 }
346
347 protected void addTempFileEntry(ActionRequest actionRequest)
348 throws Exception {
349
350 UploadPortletRequest uploadPortletRequest =
351 PortalUtil.getUploadPortletRequest(actionRequest);
352
353 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
354 WebKeys.THEME_DISPLAY);
355
356 long folderId = ParamUtil.getLong(uploadPortletRequest, "folderId");
357 String sourceFileName = uploadPortletRequest.getFileName("file");
358
359 InputStream inputStream = null;
360
361 try {
362 inputStream = uploadPortletRequest.getFileAsStream("file");
363
364 DLAppServiceUtil.addTempFileEntry(
365 themeDisplay.getScopeGroupId(), folderId, sourceFileName,
366 _TEMP_FOLDER_NAME, inputStream);
367 }
368 catch (Exception e) {
369 UploadException uploadException =
370 (UploadException)actionRequest.getAttribute(
371 WebKeys.UPLOAD_EXCEPTION);
372
373 if ((uploadException != null) &&
374 (uploadException.getCause() instanceof IOFileUploadException)) {
375
376
377
378 }
379 else if ((uploadException != null) &&
380 uploadException.isExceededSizeLimit()) {
381
382 throw new FileSizeException(uploadException.getCause());
383 }
384 else {
385 throw e;
386 }
387 }
388 finally {
389 StreamUtil.cleanUp(inputStream);
390 }
391 }
392
393 protected void cancelFileEntriesCheckOut(ActionRequest actionRequest)
394 throws Exception {
395
396 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
397
398 if (fileEntryId > 0) {
399 DLAppServiceUtil.cancelCheckOut(fileEntryId);
400 }
401 else {
402 long[] fileEntryIds = StringUtil.split(
403 ParamUtil.getString(actionRequest, "fileEntryIds"), 0L);
404
405 for (int i = 0; i < fileEntryIds.length; i++) {
406 DLAppServiceUtil.cancelCheckOut(fileEntryIds[i]);
407 }
408 }
409 }
410
411 protected void checkInFileEntries(ActionRequest actionRequest)
412 throws Exception {
413
414 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
415
416 ServiceContext serviceContext = ServiceContextFactory.getInstance(
417 actionRequest);
418
419 if (fileEntryId > 0) {
420 DLAppServiceUtil.checkInFileEntry(
421 fileEntryId, false, StringPool.BLANK, serviceContext);
422 }
423 else {
424 long[] fileEntryIds = StringUtil.split(
425 ParamUtil.getString(actionRequest, "fileEntryIds"), 0L);
426
427 for (int i = 0; i < fileEntryIds.length; i++) {
428 DLAppServiceUtil.checkInFileEntry(
429 fileEntryIds[i], false, StringPool.BLANK, serviceContext);
430 }
431 }
432 }
433
434 protected void checkOutFileEntries(ActionRequest actionRequest)
435 throws Exception {
436
437 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
438
439 ServiceContext serviceContext = ServiceContextFactory.getInstance(
440 actionRequest);
441
442 if (fileEntryId > 0) {
443 DLAppServiceUtil.checkOutFileEntry(fileEntryId, serviceContext);
444 }
445 else {
446 long[] fileEntryIds = StringUtil.split(
447 ParamUtil.getString(actionRequest, "fileEntryIds"), 0L);
448
449 for (int i = 0; i < fileEntryIds.length; i++) {
450 DLAppServiceUtil.checkOutFileEntry(
451 fileEntryIds[i], serviceContext);
452 }
453 }
454 }
455
456 protected void deleteFileEntry(
457 LiferayPortletConfig liferayPortletConfig,
458 ActionRequest actionRequest, boolean moveToTrash)
459 throws Exception {
460
461 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
462
463 if (fileEntryId == 0) {
464 return;
465 }
466
467 String version = ParamUtil.getString(actionRequest, "version");
468
469 if (Validator.isNotNull(version)) {
470 DLAppServiceUtil.deleteFileVersion(fileEntryId, version);
471
472 return;
473 }
474
475 if (!moveToTrash) {
476 DLAppServiceUtil.deleteFileEntry(fileEntryId);
477
478 return;
479 }
480
481 DLAppServiceUtil.moveFileEntryToTrash(fileEntryId);
482
483 Map<String, String[]> data = new HashMap<String, String[]>();
484
485 data.put(
486 "restoreFileEntryIds", new String[] {String.valueOf(fileEntryId)});
487
488 SessionMessages.add(
489 actionRequest,
490 liferayPortletConfig.getPortletId() +
491 SessionMessages.KEY_SUFFIX_DELETE_SUCCESS_DATA,
492 data);
493
494 SessionMessages.add(
495 actionRequest,
496 liferayPortletConfig.getPortletId() +
497 SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_SUCCESS_MESSAGE);
498 }
499
500 protected void deleteTempFileEntry(
501 ActionRequest actionRequest, ActionResponse actionResponse)
502 throws Exception {
503
504 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
505 WebKeys.THEME_DISPLAY);
506
507 long folderId = ParamUtil.getLong(actionRequest, "folderId");
508 String fileName = ParamUtil.getString(actionRequest, "fileName");
509
510 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
511
512 try {
513 DLAppServiceUtil.deleteTempFileEntry(
514 themeDisplay.getScopeGroupId(), folderId, fileName,
515 _TEMP_FOLDER_NAME);
516
517 jsonObject.put("deleted", Boolean.TRUE);
518 }
519 catch (Exception e) {
520 String errorMessage = LanguageUtil.get(
521 themeDisplay.getLocale(),
522 "an-unexpected-error-occurred-while-deleting-the-file");
523
524 jsonObject.put("deleted", Boolean.FALSE);
525 jsonObject.put("errorMessage", errorMessage);
526 }
527
528 writeJSON(actionRequest, actionResponse, jsonObject);
529 }
530
531 protected String getAddMultipleFileEntriesErrorMessage(
532 ThemeDisplay themeDisplay, Exception e)
533 throws Exception {
534
535 String errorMessage = null;
536
537 if (e instanceof AssetCategoryException) {
538 AssetCategoryException ace = (AssetCategoryException)e;
539
540 AssetVocabulary assetVocabulary = ace.getVocabulary();
541
542 String vocabularyTitle = StringPool.BLANK;
543
544 if (assetVocabulary != null) {
545 vocabularyTitle = assetVocabulary.getTitle(
546 themeDisplay.getLocale());
547 }
548
549 if (ace.getType() == AssetCategoryException.AT_LEAST_ONE_CATEGORY) {
550 errorMessage = LanguageUtil.format(
551 themeDisplay.getLocale(),
552 "please-select-at-least-one-category-for-x",
553 vocabularyTitle);
554 }
555 else if (ace.getType() ==
556 AssetCategoryException.TOO_MANY_CATEGORIES) {
557
558 errorMessage = LanguageUtil.format(
559 themeDisplay.getLocale(),
560 "you-cannot-select-more-than-one-category-for-x",
561 vocabularyTitle);
562 }
563 }
564 else if (e instanceof DuplicateFileException) {
565 errorMessage = LanguageUtil.get(
566 themeDisplay.getLocale(),
567 "the-folder-you-selected-already-has-an-entry-with-this-name." +
568 "-please-select-a-different-folder");
569 }
570 else if (e instanceof FileExtensionException) {
571 errorMessage = LanguageUtil.format(
572 themeDisplay.getLocale(),
573 "please-enter-a-file-with-a-valid-extension-x",
574 StringUtil.merge(
575 PrefsPropsUtil.getStringArray(
576 PropsKeys.DL_FILE_EXTENSIONS, StringPool.COMMA)));
577 }
578 else if (e instanceof FileNameException) {
579 errorMessage = LanguageUtil.get(
580 themeDisplay.getLocale(),
581 "please-enter-a-file-with-a-valid-file-name");
582 }
583 else if (e instanceof FileSizeException) {
584 long maxSizeMB = PrefsPropsUtil.getLong(
585 PropsKeys.DL_FILE_MAX_SIZE) / 1024 / 1024;
586
587 errorMessage = LanguageUtil.format(
588 themeDisplay.getLocale(),
589 "file-size-is-larger-than-x-megabytes", maxSizeMB);
590 }
591 else if (e instanceof InvalidFileEntryTypeException) {
592 errorMessage = LanguageUtil.get(
593 themeDisplay.getLocale(),
594 "the-document-type-you-selected-is-not-valid-for-this-folder");
595 }
596 else {
597 errorMessage = LanguageUtil.get(
598 themeDisplay.getLocale(),
599 "an-unexpected-error-occurred-while-saving-your-document");
600 }
601
602 return errorMessage;
603 }
604
605 protected void handleUploadException(
606 ActionRequest actionRequest, ActionResponse actionResponse,
607 String cmd, Exception e)
608 throws Exception {
609
610 if (e instanceof AssetCategoryException ||
611 e instanceof AssetTagException) {
612
613 SessionErrors.add(actionRequest, e.getClass(), e);
614 }
615 else if (e instanceof DuplicateFileException ||
616 e instanceof DuplicateFolderNameException ||
617 e instanceof FileExtensionException ||
618 e instanceof FileMimeTypeException ||
619 e instanceof FileNameException ||
620 e instanceof FileSizeException ||
621 e instanceof NoSuchFolderException ||
622 e instanceof SourceFileNameException ||
623 e instanceof StorageFieldRequiredException) {
624
625 if (!cmd.equals(Constants.ADD_MULTIPLE) &&
626 !cmd.equals(Constants.ADD_TEMP)) {
627
628 SessionErrors.add(actionRequest, e.getClass());
629
630 return;
631 }
632
633 if (e instanceof DuplicateFileException ||
634 e instanceof FileExtensionException ||
635 e instanceof FileNameException ||
636 e instanceof FileSizeException) {
637
638 HttpServletResponse response =
639 PortalUtil.getHttpServletResponse(actionResponse);
640
641 response.setContentType(ContentTypes.TEXT_HTML);
642 response.setStatus(HttpServletResponse.SC_OK);
643
644 int errorType = 0;
645
646 if (e instanceof DuplicateFileException) {
647 errorType =
648 ServletResponseConstants.SC_DUPLICATE_FILE_EXCEPTION;
649 }
650 else if (e instanceof FileExtensionException) {
651 errorType =
652 ServletResponseConstants.SC_FILE_EXTENSION_EXCEPTION;
653 }
654 else if (e instanceof FileNameException) {
655 errorType = ServletResponseConstants.SC_FILE_NAME_EXCEPTION;
656 }
657 else if (e instanceof FileSizeException) {
658 errorType = ServletResponseConstants.SC_FILE_SIZE_EXCEPTION;
659 }
660
661 ServletResponseUtil.write(response, String.valueOf(errorType));
662 }
663
664 SessionErrors.add(actionRequest, e.getClass());
665 }
666 else if (e instanceof DuplicateLockException ||
667 e instanceof InvalidFileVersionException ||
668 e instanceof NoSuchFileEntryException ||
669 e instanceof PrincipalException) {
670
671 if (e instanceof DuplicateLockException) {
672 DuplicateLockException dle = (DuplicateLockException)e;
673
674 SessionErrors.add(actionRequest, dle.getClass(), dle.getLock());
675 }
676 else {
677 SessionErrors.add(actionRequest, e.getClass());
678 }
679
680 setForward(actionRequest, "portlet.document_library.error");
681 }
682 else {
683 throw e;
684 }
685 }
686
687 protected void moveFileEntries(
688 ActionRequest actionRequest, boolean moveFromTrash)
689 throws Exception {
690
691 long[] fileEntryIds = null;
692
693 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
694
695 if (fileEntryId > 0) {
696 fileEntryIds = new long[] {fileEntryId};
697 }
698 else {
699 fileEntryIds = StringUtil.split(
700 ParamUtil.getString(actionRequest, "fileEntryIds"), 0L);
701 }
702
703 long newFolderId = ParamUtil.getLong(actionRequest, "newFolderId");
704
705 ServiceContext serviceContext = ServiceContextFactory.getInstance(
706 DLFileEntry.class.getName(), actionRequest);
707
708 for (long moveFileEntryId : fileEntryIds) {
709 if (moveFromTrash) {
710 DLAppServiceUtil.moveFileEntryFromTrash(
711 moveFileEntryId, newFolderId, serviceContext);
712 }
713
714 else {
715 DLAppServiceUtil.moveFileEntry(
716 moveFileEntryId, newFolderId, serviceContext);
717 }
718 }
719 }
720
721 protected void revertFileEntry(ActionRequest actionRequest)
722 throws Exception {
723
724 long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
725 String version = ParamUtil.getString(actionRequest, "version");
726
727 ServiceContext serviceContext = ServiceContextFactory.getInstance(
728 DLFileEntry.class.getName(), actionRequest);
729
730 DLAppServiceUtil.revertFileEntry(fileEntryId, version, serviceContext);
731 }
732
733 protected void updateFileEntry(
734 PortletConfig portletConfig, ActionRequest actionRequest,
735 ActionResponse actionResponse)
736 throws Exception {
737
738 UploadPortletRequest uploadPortletRequest =
739 PortalUtil.getUploadPortletRequest(actionRequest);
740
741 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
742 WebKeys.THEME_DISPLAY);
743
744 String cmd = ParamUtil.getString(uploadPortletRequest, Constants.CMD);
745
746 long fileEntryId = ParamUtil.getLong(
747 uploadPortletRequest, "fileEntryId");
748
749 long repositoryId = ParamUtil.getLong(
750 uploadPortletRequest, "repositoryId");
751 long folderId = ParamUtil.getLong(uploadPortletRequest, "folderId");
752 String sourceFileName = uploadPortletRequest.getFileName("file");
753 String title = ParamUtil.getString(uploadPortletRequest, "title");
754 String description = ParamUtil.getString(
755 uploadPortletRequest, "description");
756 String changeLog = ParamUtil.getString(
757 uploadPortletRequest, "changeLog");
758 boolean majorVersion = ParamUtil.getBoolean(
759 uploadPortletRequest, "majorVersion");
760
761 if (folderId > 0) {
762 Folder folder = DLAppServiceUtil.getFolder(folderId);
763
764 if (folder.getGroupId() != themeDisplay.getScopeGroupId()) {
765 throw new NoSuchFolderException();
766 }
767 }
768
769 InputStream inputStream = null;
770
771 try {
772 String contentType = uploadPortletRequest.getContentType("file");
773
774 long size = uploadPortletRequest.getSize("file");
775
776 if (cmd.equals(Constants.ADD) && (size == 0)) {
777 contentType = MimeTypesUtil.getContentType(title);
778 }
779
780 if (cmd.equals(Constants.ADD) || (size > 0)) {
781 String portletName = portletConfig.getPortletName();
782
783 if (portletName.equals(PortletKeys.MEDIA_GALLERY_DISPLAY)) {
784 String portletResource = ParamUtil.getString(
785 actionRequest, "portletResource");
786
787 PortletPreferences portletPreferences = null;
788
789 if (Validator.isNotNull(portletResource)) {
790 PortletPreferencesFactoryUtil.getPortletSetup(
791 actionRequest, portletResource);
792 }
793 else {
794 portletPreferences = actionRequest.getPreferences();
795 }
796
797 String[] mimeTypes = DLUtil.getMediaGalleryMimeTypes(
798 portletPreferences, actionRequest);
799
800 if (Arrays.binarySearch(mimeTypes, contentType) < 0) {
801 throw new FileMimeTypeException(contentType);
802 }
803 }
804 }
805
806 inputStream = uploadPortletRequest.getFileAsStream("file");
807
808 ServiceContext serviceContext = ServiceContextFactory.getInstance(
809 DLFileEntry.class.getName(), uploadPortletRequest);
810
811 FileEntry fileEntry = null;
812
813 if (cmd.equals(Constants.ADD)) {
814
815
816
817 fileEntry = DLAppServiceUtil.addFileEntry(
818 repositoryId, folderId, sourceFileName, contentType, title,
819 description, changeLog, inputStream, size, serviceContext);
820
821 AssetPublisherUtil.addAndStoreSelection(
822 actionRequest, DLFileEntry.class.getName(),
823 fileEntry.getFileEntryId(), -1);
824 }
825 else if (cmd.equals(Constants.UPDATE_AND_CHECKIN)) {
826
827
828
829 fileEntry = DLAppServiceUtil.updateFileEntryAndCheckIn(
830 fileEntryId, sourceFileName, contentType, title,
831 description, changeLog, majorVersion, inputStream, size,
832 serviceContext);
833 }
834 else {
835
836
837
838 fileEntry = DLAppServiceUtil.updateFileEntry(
839 fileEntryId, sourceFileName, contentType, title,
840 description, changeLog, majorVersion, inputStream, size,
841 serviceContext);
842 }
843
844 AssetPublisherUtil.addRecentFolderId(
845 actionRequest, DLFileEntry.class.getName(), folderId);
846 }
847 finally {
848 StreamUtil.cleanUp(inputStream);
849 }
850 }
851
852 private static final String _TEMP_FOLDER_NAME =
853 EditFileEntryAction.class.getName();
854
855 }