001
014
015 package com.liferay.portlet.documentlibrary.util;
016
017 import com.liferay.portal.kernel.configuration.Filter;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.log.Log;
021 import com.liferay.portal.kernel.log.LogFactoryUtil;
022 import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
023 import com.liferay.portal.kernel.portlet.LiferayWindowState;
024 import com.liferay.portal.kernel.repository.model.FileEntry;
025 import com.liferay.portal.kernel.repository.model.FileVersion;
026 import com.liferay.portal.kernel.repository.model.Folder;
027 import com.liferay.portal.kernel.search.Document;
028 import com.liferay.portal.kernel.search.Field;
029 import com.liferay.portal.kernel.search.Hits;
030 import com.liferay.portal.kernel.util.ArrayUtil;
031 import com.liferay.portal.kernel.util.GetterUtil;
032 import com.liferay.portal.kernel.util.HtmlUtil;
033 import com.liferay.portal.kernel.util.HttpUtil;
034 import com.liferay.portal.kernel.util.LocaleUtil;
035 import com.liferay.portal.kernel.util.LocalizationUtil;
036 import com.liferay.portal.kernel.util.OrderByComparator;
037 import com.liferay.portal.kernel.util.ParamUtil;
038 import com.liferay.portal.kernel.util.PrefsParamUtil;
039 import com.liferay.portal.kernel.util.PrefsPropsUtil;
040 import com.liferay.portal.kernel.util.PropsKeys;
041 import com.liferay.portal.kernel.util.PropsUtil;
042 import com.liferay.portal.kernel.util.SetUtil;
043 import com.liferay.portal.kernel.util.StringBundler;
044 import com.liferay.portal.kernel.util.StringPool;
045 import com.liferay.portal.kernel.util.StringUtil;
046 import com.liferay.portal.kernel.util.Validator;
047 import com.liferay.portal.kernel.util.WebKeys;
048 import com.liferay.portal.kernel.workflow.WorkflowConstants;
049 import com.liferay.portal.model.Group;
050 import com.liferay.portal.model.Subscription;
051 import com.liferay.portal.service.SubscriptionLocalServiceUtil;
052 import com.liferay.portal.service.WorkflowDefinitionLinkLocalServiceUtil;
053 import com.liferay.portal.theme.PortletDisplay;
054 import com.liferay.portal.theme.ThemeDisplay;
055 import com.liferay.portal.util.PortalUtil;
056 import com.liferay.portal.util.PortletKeys;
057 import com.liferay.portal.util.PropsValues;
058 import com.liferay.portlet.PortletPreferencesFactoryUtil;
059 import com.liferay.portlet.PortletURLFactoryUtil;
060 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
061 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
062 import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
063 import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
064 import com.liferay.portlet.documentlibrary.model.DLFolder;
065 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
066 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
067 import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
068 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelCreateDateComparator;
069 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelModifiedDateComparator;
070 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelNameComparator;
071 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelReadCountComparator;
072 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelSizeComparator;
073 import com.liferay.portlet.messageboards.model.MBMessage;
074 import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
075 import com.liferay.portlet.trash.util.TrashUtil;
076 import com.liferay.util.ContentUtil;
077
078 import java.util.ArrayList;
079 import java.util.Arrays;
080 import java.util.Collections;
081 import java.util.Date;
082 import java.util.HashMap;
083 import java.util.HashSet;
084 import java.util.List;
085 import java.util.Locale;
086 import java.util.Map;
087 import java.util.Set;
088 import java.util.TreeSet;
089
090 import javax.portlet.PortletPreferences;
091 import javax.portlet.PortletRequest;
092 import javax.portlet.PortletURL;
093 import javax.portlet.RenderResponse;
094
095 import javax.servlet.http.HttpServletRequest;
096
097
101 public class DLImpl implements DL {
102
103 @Override
104 public void addPortletBreadcrumbEntries(
105 DLFileShortcut dlFileShortcut, HttpServletRequest request,
106 RenderResponse renderResponse)
107 throws Exception {
108
109 Folder folder = dlFileShortcut.getFolder();
110
111 if (folder.getFolderId() !=
112 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
113
114 addPortletBreadcrumbEntries(folder, request, renderResponse);
115 }
116
117 DLFileShortcut unescapedDLFileShortcut =
118 dlFileShortcut.toUnescapedModel();
119
120 PortletURL portletURL = renderResponse.createRenderURL();
121
122 portletURL.setParameter(
123 "struts_action", "/document_library/view_file_entry");
124 portletURL.setParameter(
125 "fileEntryId", String.valueOf(dlFileShortcut.getToFileEntryId()));
126
127 PortalUtil.addPortletBreadcrumbEntry(
128 request, unescapedDLFileShortcut.getToTitle(),
129 portletURL.toString());
130 }
131
132 @Override
133 public void addPortletBreadcrumbEntries(
134 FileEntry fileEntry, HttpServletRequest request,
135 RenderResponse renderResponse)
136 throws Exception {
137
138 Folder folder = fileEntry.getFolder();
139
140 if (folder.getFolderId() !=
141 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
142
143 addPortletBreadcrumbEntries(folder, request, renderResponse);
144 }
145
146 PortletURL portletURL = renderResponse.createRenderURL();
147
148 FileEntry unescapedFileEntry = fileEntry.toUnescapedModel();
149
150 portletURL.setParameter(
151 "struts_action", "/document_library/view_file_entry");
152 portletURL.setParameter(
153 "fileEntryId", String.valueOf(fileEntry.getFileEntryId()));
154
155 PortalUtil.addPortletBreadcrumbEntry(
156 request, unescapedFileEntry.getTitle(), portletURL.toString());
157 }
158
159 @Override
160 public void addPortletBreadcrumbEntries(
161 Folder folder, HttpServletRequest request,
162 LiferayPortletResponse liferayPortletResponse)
163 throws Exception {
164
165 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
166 WebKeys.THEME_DISPLAY);
167
168 PortletURL portletURL = liferayPortletResponse.createRenderURL();
169
170 portletURL.setParameter("struts_action", "/document_library/view");
171
172 Map<String, Object> data = new HashMap<String, Object>();
173
174 data.put("direction-right", Boolean.TRUE.toString());
175 data.put("folder-id", getDefaultFolderId(request));
176
177 PortalUtil.addPortletBreadcrumbEntry(
178 request, themeDisplay.translate("home"), portletURL.toString(),
179 data);
180
181 addPortletBreadcrumbEntries(folder, request, portletURL);
182 }
183
184 @Override
185 public void addPortletBreadcrumbEntries(
186 Folder folder, HttpServletRequest request, PortletURL portletURL)
187 throws Exception {
188
189 long defaultFolderId = getDefaultFolderId(request);
190
191 List<Folder> ancestorFolders = Collections.emptyList();
192
193 if ((folder != null) && (folder.getFolderId() != defaultFolderId)) {
194 ancestorFolders = folder.getAncestors();
195
196 int indexOfRootFolder = -1;
197
198 for (int i = 0; i < ancestorFolders.size(); i++) {
199 Folder ancestorFolder = ancestorFolders.get(i);
200
201 if (defaultFolderId == ancestorFolder.getFolderId()) {
202 indexOfRootFolder = i;
203 }
204 }
205
206 if (indexOfRootFolder > -1) {
207 ancestorFolders = ancestorFolders.subList(0, indexOfRootFolder);
208 }
209 }
210
211 Collections.reverse(ancestorFolders);
212
213 for (Folder ancestorFolder : ancestorFolders) {
214 portletURL.setParameter(
215 "folderId", String.valueOf(ancestorFolder.getFolderId()));
216
217 Map<String, Object> data = new HashMap<String, Object>();
218
219 data.put("direction-right", Boolean.TRUE.toString());
220 data.put("folder-id", ancestorFolder.getFolderId());
221
222 PortalUtil.addPortletBreadcrumbEntry(
223 request, ancestorFolder.getName(), portletURL.toString(), data);
224 }
225
226 long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
227
228 if (folder != null) {
229 folderId = folder.getFolderId();
230 }
231
232 portletURL.setParameter("folderId", String.valueOf(folderId));
233
234 if ((folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
235 (folderId != defaultFolderId)) {
236
237 Folder unescapedFolder = folder.toUnescapedModel();
238
239 Map<String, Object> data = new HashMap<String, Object>();
240
241 data.put("direction-right", Boolean.TRUE.toString());
242 data.put("folder-id", folderId);
243
244 PortalUtil.addPortletBreadcrumbEntry(
245 request, unescapedFolder.getName(), portletURL.toString(),
246 data);
247 }
248 }
249
250 @Override
251 public void addPortletBreadcrumbEntries(
252 Folder folder, HttpServletRequest request,
253 RenderResponse renderResponse)
254 throws Exception {
255
256 String strutsAction = ParamUtil.getString(request, "struts_action");
257
258 long groupId = ParamUtil.getLong(request, "groupId");
259
260 PortletURL portletURL = renderResponse.createRenderURL();
261
262 if (strutsAction.equals("/document_library/select_file_entry") ||
263 strutsAction.equals("/document_library/select_folder") ||
264 strutsAction.equals("/document_library_display/select_folder") ||
265 strutsAction.equals(
266 "/dynamic_data_mapping/select_document_library") ||
267 strutsAction.equals("/image_gallery_display/select_folder")) {
268
269 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
270 WebKeys.THEME_DISPLAY);
271
272 portletURL.setParameter("struts_action", strutsAction);
273 portletURL.setParameter("groupId", String.valueOf(groupId));
274 portletURL.setWindowState(LiferayWindowState.POP_UP);
275
276 PortalUtil.addPortletBreadcrumbEntry(
277 request, themeDisplay.translate("home"), portletURL.toString());
278 }
279 else {
280 portletURL.setParameter("struts_action", "/document_library/view");
281 }
282
283 addPortletBreadcrumbEntries(folder, request, portletURL);
284 }
285
286 @Override
287 public void addPortletBreadcrumbEntries(
288 long folderId, HttpServletRequest request,
289 RenderResponse renderResponse)
290 throws Exception {
291
292 if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
293 Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
294
295 if (folder.getFolderId() !=
296 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
297
298 addPortletBreadcrumbEntries(folder, request, renderResponse);
299 }
300 }
301 }
302
303 @Override
304 public int compareVersions(String version1, String version2) {
305 int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0);
306 int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0);
307
308 if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) {
309 return 0;
310 }
311 else if (splitVersion1.length != 2) {
312 return -1;
313 }
314 else if (splitVersion2.length != 2) {
315 return 1;
316 }
317
318 if (splitVersion1[0] > splitVersion2[0]) {
319 return 1;
320 }
321 else if (splitVersion1[0] < splitVersion2[0]) {
322 return -1;
323 }
324 else if (splitVersion1[1] > splitVersion2[1]) {
325 return 1;
326 }
327 else if (splitVersion1[1] < splitVersion2[1]) {
328 return -1;
329 }
330
331 return 0;
332 }
333
334 @Override
335 public String getAbsolutePath(PortletRequest portletRequest, long folderId)
336 throws PortalException, SystemException {
337
338 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
339 WebKeys.THEME_DISPLAY);
340
341 if (folderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
342 return themeDisplay.translate("home");
343 }
344
345 DLFolder dlFolder = DLFolderLocalServiceUtil.getFolder(folderId);
346
347 List<DLFolder> dlFolders = dlFolder.getAncestors();
348
349 Collections.reverse(dlFolders);
350
351 StringBundler sb = new StringBundler((dlFolders.size() * 3) + 5);
352
353 sb.append(themeDisplay.translate("home"));
354 sb.append(StringPool.SPACE);
355
356 for (DLFolder curDLFolder : dlFolders) {
357 sb.append(StringPool.RAQUO);
358 sb.append(StringPool.SPACE);
359 sb.append(curDLFolder.getName());
360 }
361
362 sb.append(StringPool.RAQUO);
363 sb.append(StringPool.SPACE);
364 sb.append(dlFolder.getName());
365
366 return sb.toString();
367 }
368
369 @Override
370 public Set<String> getAllMediaGalleryMimeTypes() {
371 return _allMediaGalleryMimeTypes;
372 }
373
374 @Override
375 public String getDDMStructureKey(DLFileEntryType dlFileEntryType) {
376 return getDDMStructureKey(dlFileEntryType.getUuid());
377 }
378
379 @Override
380 public String getDDMStructureKey(String fileEntryTypeUuid) {
381 return _STRUCTURE_KEY_PREFIX + fileEntryTypeUuid.toUpperCase();
382 }
383
384 @Override
385 public String getDeprecatedDDMStructureKey(
386 DLFileEntryType dlFileEntryType) {
387
388 return getDeprecatedDDMStructureKey(
389 dlFileEntryType.getFileEntryTypeId());
390 }
391
392 @Override
393 public String getDeprecatedDDMStructureKey(long fileEntryTypeId) {
394 return _STRUCTURE_KEY_PREFIX + fileEntryTypeId;
395 }
396
397 @Override
398 public String getDividedPath(long id) {
399 StringBundler sb = new StringBundler(16);
400
401 long dividend = id;
402
403 while ((dividend / _DIVISOR) != 0) {
404 sb.append(StringPool.SLASH);
405 sb.append(dividend % _DIVISOR);
406
407 dividend = dividend / _DIVISOR;
408 }
409
410 sb.append(StringPool.SLASH);
411 sb.append(id);
412
413 return sb.toString();
414 }
415
416 @Override
417 public String getDLControlPanelLink(
418 PortletRequest portletRequest, long folderId)
419 throws PortalException, SystemException {
420
421 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
422 WebKeys.THEME_DISPLAY);
423
424 PortletURL portletURL = PortletURLFactoryUtil.create(
425 portletRequest, PortletKeys.DOCUMENT_LIBRARY,
426 PortalUtil.getControlPanelPlid(themeDisplay.getCompanyId()),
427 PortletRequest.RENDER_PHASE);
428
429 portletURL.setParameter("struts_action", "/document_library/view");
430 portletURL.setParameter("folderId", String.valueOf(folderId));
431
432 return portletURL.toString();
433 }
434
435 @Override
436 public Map<Locale, String> getEmailFileEntryAddedBodyMap(
437 PortletPreferences preferences) {
438
439 Map<Locale, String> map = LocalizationUtil.getLocalizationMap(
440 preferences, "emailFileEntryAddedBody");
441
442 Locale defaultLocale = LocaleUtil.getSiteDefault();
443
444 String defaultValue = map.get(defaultLocale);
445
446 if (Validator.isNotNull(defaultValue)) {
447 return map;
448 }
449
450 map.put(
451 defaultLocale,
452 ContentUtil.get(
453 PropsUtil.get(PropsKeys.DL_EMAIL_FILE_ENTRY_ADDED_BODY)));
454
455 return map;
456 }
457
458 @Override
459 public boolean getEmailFileEntryAddedEnabled(
460 PortletPreferences preferences) {
461
462 String emailFileEntryAddedEnabled = preferences.getValue(
463 "emailFileEntryAddedEnabled", StringPool.BLANK);
464
465 if (Validator.isNotNull(emailFileEntryAddedEnabled)) {
466 return GetterUtil.getBoolean(emailFileEntryAddedEnabled);
467 }
468 else {
469 return PropsValues.DL_EMAIL_FILE_ENTRY_ADDED_ENABLED;
470 }
471 }
472
473 @Override
474 public Map<Locale, String> getEmailFileEntryAddedSubjectMap(
475 PortletPreferences preferences) {
476
477 Map<Locale, String> map = LocalizationUtil.getLocalizationMap(
478 preferences, "emailFileEntryAddedSubject");
479
480 Locale defaultLocale = LocaleUtil.getSiteDefault();
481
482 String defaultValue = map.get(defaultLocale);
483
484 if (Validator.isNotNull(defaultValue)) {
485 return map;
486 }
487
488 map.put(
489 defaultLocale,
490 ContentUtil.get(
491 PropsUtil.get(PropsKeys.DL_EMAIL_FILE_ENTRY_ADDED_SUBJECT)));
492
493 return map;
494 }
495
496 @Override
497 public Map<Locale, String> getEmailFileEntryUpdatedBodyMap(
498 PortletPreferences preferences) {
499
500 Map<Locale, String> map = LocalizationUtil.getLocalizationMap(
501 preferences, "emailFileEntryUpdatedBody");
502
503 Locale defaultLocale = LocaleUtil.getSiteDefault();
504
505 String defaultValue = map.get(defaultLocale);
506
507 if (Validator.isNotNull(defaultValue)) {
508 return map;
509 }
510
511 map.put(
512 defaultLocale,
513 ContentUtil.get(
514 PropsUtil.get(PropsKeys.DL_EMAIL_FILE_ENTRY_UPDATED_BODY)));
515
516 return map;
517 }
518
519 @Override
520 public boolean getEmailFileEntryUpdatedEnabled(
521 PortletPreferences preferences) {
522
523 String emailFileEntryUpdatedEnabled = preferences.getValue(
524 "emailFileEntryUpdatedEnabled", StringPool.BLANK);
525
526 if (Validator.isNotNull(emailFileEntryUpdatedEnabled)) {
527 return GetterUtil.getBoolean(emailFileEntryUpdatedEnabled);
528 }
529 else {
530 return PropsValues.DL_EMAIL_FILE_ENTRY_UPDATED_ENABLED;
531 }
532 }
533
534 @Override
535 public Map<Locale, String> getEmailFileEntryUpdatedSubjectMap(
536 PortletPreferences preferences) {
537
538 Map<Locale, String> map = LocalizationUtil.getLocalizationMap(
539 preferences, "emailFileEntryUpdatedSubject");
540
541 Locale defaultLocale = LocaleUtil.getSiteDefault();
542
543 String defaultValue = map.get(defaultLocale);
544
545 if (Validator.isNotNull(defaultValue)) {
546 return map;
547 }
548
549 map.put(
550 defaultLocale,
551 ContentUtil.get(
552 PropsUtil.get(PropsKeys.DL_EMAIL_FILE_ENTRY_UPDATED_SUBJECT)));
553
554 return map;
555 }
556
557 @Override
558 public String getEmailFromAddress(
559 PortletPreferences preferences, long companyId)
560 throws SystemException {
561
562 return PortalUtil.getEmailFromAddress(
563 preferences, companyId, PropsValues.DL_EMAIL_FROM_ADDRESS);
564 }
565
566 @Override
567 public String getEmailFromName(
568 PortletPreferences preferences, long companyId)
569 throws SystemException {
570
571 return PortalUtil.getEmailFromName(
572 preferences, companyId, PropsValues.DL_EMAIL_FROM_NAME);
573 }
574
575 @Override
576 public List<Object> getEntries(Hits hits) {
577 List<Object> entries = new ArrayList<Object>();
578
579 for (Document document : hits.getDocs()) {
580 String entryClassName = GetterUtil.getString(
581 document.get(Field.ENTRY_CLASS_NAME));
582 long entryClassPK = GetterUtil.getLong(
583 document.get(Field.ENTRY_CLASS_PK));
584
585 try {
586 Object obj = null;
587
588 if (entryClassName.equals(DLFileEntry.class.getName())) {
589 obj = DLAppLocalServiceUtil.getFileEntry(entryClassPK);
590 }
591 else if (entryClassName.equals(MBMessage.class.getName())) {
592 long classPK = GetterUtil.getLong(
593 document.get(Field.CLASS_PK));
594
595 DLAppLocalServiceUtil.getFileEntry(classPK);
596
597 obj = MBMessageLocalServiceUtil.getMessage(entryClassPK);
598 }
599
600 entries.add(obj);
601 }
602 catch (Exception e) {
603 if (_log.isWarnEnabled()) {
604 _log.warn(
605 "Documents and Media search index is stale and " +
606 "contains entry {className=" + entryClassName +
607 ", classPK=" + entryClassPK + "}");
608 }
609 }
610 }
611
612 return entries;
613 }
614
615 @Override
616 public String getFileEntryImage(
617 FileEntry fileEntry, ThemeDisplay themeDisplay) {
618
619 StringBundler sb = new StringBundler(5);
620
621 sb.append("<img style=\"border-width: 0; text-align: left;\" src=\"");
622 sb.append(themeDisplay.getPathThemeImages());
623 sb.append("/file_system/small/");
624 sb.append(fileEntry.getIcon());
625 sb.append(".png\">");
626
627 return sb.toString();
628 }
629
630 @Override
631 public Set<Long> getFileEntryTypeSubscriptionClassPKs(long userId)
632 throws SystemException {
633
634 List<Subscription> subscriptions =
635 SubscriptionLocalServiceUtil.getUserSubscriptions(
636 userId, DLFileEntryType.class.getName());
637
638 Set<Long> classPKs = new HashSet<Long>(subscriptions.size());
639
640 for (Subscription subscription : subscriptions) {
641 classPKs.add(subscription.getClassPK());
642 }
643
644 return classPKs;
645 }
646
647 @Override
648 public String getFileIcon(String extension) {
649 if (!_fileIcons.contains(extension)) {
650 extension = _DEFAULT_FILE_ICON;
651 }
652
653 return extension;
654 }
655
656 @Override
657 public String getGenericName(String extension) {
658 String genericName = _genericNames.get(extension);
659
660 if (genericName == null) {
661 genericName = _DEFAULT_GENERIC_NAME;
662 }
663
664 return genericName;
665 }
666
667 @Override
668 public String getImagePreviewURL(
669 FileEntry fileEntry, FileVersion fileVersion,
670 ThemeDisplay themeDisplay)
671 throws Exception {
672
673 String previewQueryString = null;
674
675 if (PropsValues.DL_FILE_ENTRY_THUMBNAIL_ENABLED) {
676 if (ImageProcessorUtil.hasImages(fileVersion)) {
677 previewQueryString = "&imagePreview=1";
678 }
679 else if (PDFProcessorUtil.hasImages(fileVersion)) {
680 previewQueryString = "&previewFileIndex=1";
681 }
682 else if (VideoProcessorUtil.hasVideo(fileVersion)) {
683 previewQueryString = "&videoThumbnail=1";
684 }
685 }
686
687 return getImageSrc(
688 fileEntry, fileVersion, themeDisplay, previewQueryString);
689 }
690
691 @Override
692 public String getImagePreviewURL(
693 FileEntry fileEntry, ThemeDisplay themeDisplay)
694 throws Exception {
695
696 return getImagePreviewURL(
697 fileEntry, fileEntry.getFileVersion(), themeDisplay);
698 }
699
700 @Override
701 public String[] getMediaGalleryMimeTypes(
702 PortletPreferences portletPreferences, PortletRequest portletRequest) {
703
704 String mimeTypes = PrefsParamUtil.getString(
705 portletPreferences, portletRequest, "mimeTypes",
706 _allMediaGalleryMimeTypesString);
707
708 String[] mimeTypesArray = StringUtil.split(mimeTypes);
709
710 Arrays.sort(mimeTypesArray);
711
712 return mimeTypesArray;
713 }
714
715 @Override
716 public String getPreviewURL(
717 FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
718 String queryString) {
719
720 return getPreviewURL(
721 fileEntry, fileVersion, themeDisplay, queryString, true, true);
722 }
723
724
728 @Override
729 public String getPreviewURL(
730 FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
731 String queryString, boolean appendToken) {
732
733 return getPreviewURL(
734 fileEntry, fileVersion, themeDisplay, queryString, true, true);
735 }
736
737 @Override
738 public String getPreviewURL(
739 FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
740 String queryString, boolean appendVersion, boolean absoluteURL) {
741
742 StringBundler sb = new StringBundler(17);
743
744 if (themeDisplay != null) {
745 if (absoluteURL) {
746 sb.append(themeDisplay.getPortalURL());
747 }
748 }
749
750 sb.append(PortalUtil.getPathContext());
751 sb.append("/documents/");
752 sb.append(fileEntry.getRepositoryId());
753 sb.append(StringPool.SLASH);
754 sb.append(fileEntry.getFolderId());
755 sb.append(StringPool.SLASH);
756
757 String title = fileEntry.getTitle();
758
759 if (fileVersion.isInTrash()) {
760 title = TrashUtil.getOriginalTitle(fileEntry.getTitle());
761 }
762
763 sb.append(HttpUtil.encodeURL(HtmlUtil.unescape(title)));
764
765 sb.append(StringPool.SLASH);
766 sb.append(fileEntry.getUuid());
767
768 if (appendVersion) {
769 sb.append("?version=");
770 sb.append(fileVersion.getVersion());
771 }
772
773 if (ImageProcessorUtil.isImageSupported(fileVersion)) {
774 if (appendVersion) {
775 sb.append("&t=");
776 }
777 else {
778 sb.append("?t=");
779 }
780
781 Date modifiedDate = fileVersion.getModifiedDate();
782
783 sb.append(modifiedDate.getTime());
784 }
785
786 sb.append(queryString);
787
788 if (themeDisplay != null) {
789 PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
790
791 if (portletDisplay != null) {
792 String portletId = portletDisplay.getId();
793
794 if (portletId.equals(PortletKeys.TRASH)) {
795 sb.append("&status=");
796 sb.append(WorkflowConstants.STATUS_IN_TRASH);
797 }
798 }
799 }
800
801 String previewURL = sb.toString();
802
803 if ((themeDisplay != null) && themeDisplay.isAddSessionIdToURL()) {
804 return PortalUtil.getURLWithSessionId(
805 previewURL, themeDisplay.getSessionId());
806 }
807
808 return previewURL;
809 }
810
811 @Override
812 public OrderByComparator getRepositoryModelOrderByComparator(
813 String orderByCol, String orderByType) {
814
815 boolean orderByAsc = true;
816
817 if (orderByType.equals("desc")) {
818 orderByAsc = false;
819 }
820
821 OrderByComparator orderByComparator = null;
822
823 if (orderByCol.equals("creationDate")) {
824 orderByComparator = new RepositoryModelCreateDateComparator(
825 orderByAsc);
826 }
827 else if (orderByCol.equals("downloads")) {
828 orderByComparator = new RepositoryModelReadCountComparator(
829 orderByAsc);
830 }
831 else if (orderByCol.equals("modifiedDate")) {
832 orderByComparator = new RepositoryModelModifiedDateComparator(
833 orderByAsc);
834 }
835 else if (orderByCol.equals("size")) {
836 orderByComparator = new RepositoryModelSizeComparator(orderByAsc);
837 }
838 else {
839 orderByComparator = new RepositoryModelNameComparator(orderByAsc);
840 }
841
842 return orderByComparator;
843 }
844
845 @Override
846 public String getTempFileId(long id, String version) {
847 return getTempFileId(id, version, null);
848 }
849
850 @Override
851 public String getTempFileId(long id, String version, String languageId) {
852 if (Validator.isNull(languageId)) {
853 return String.valueOf(id).concat(StringPool.PERIOD).concat(version);
854 }
855
856 StringBundler sb = new StringBundler(5);
857
858 sb.append(id);
859 sb.append(StringPool.PERIOD);
860 sb.append(version);
861 sb.append(StringPool.PERIOD);
862 sb.append(languageId);
863
864 return sb.toString();
865 }
866
867 @Override
868 public String getThumbnailSrc(
869 FileEntry fileEntry, DLFileShortcut dlFileShortcut,
870 ThemeDisplay themeDisplay)
871 throws Exception {
872
873 return getThumbnailSrc(
874 fileEntry, fileEntry.getFileVersion(), dlFileShortcut,
875 themeDisplay);
876 }
877
878 @Override
879 public String getThumbnailSrc(
880 FileEntry fileEntry, FileVersion fileVersion,
881 DLFileShortcut dlFileShortcut, ThemeDisplay themeDisplay)
882 throws Exception {
883
884 String thumbnailQueryString = null;
885
886 if (PropsValues.DL_FILE_ENTRY_THUMBNAIL_ENABLED) {
887 if (ImageProcessorUtil.hasImages(fileVersion)) {
888 thumbnailQueryString = "&imageThumbnail=1";
889 }
890 else if (PDFProcessorUtil.hasImages(fileVersion)) {
891 thumbnailQueryString = "&documentThumbnail=1";
892 }
893 else if (VideoProcessorUtil.hasVideo(fileVersion)) {
894 thumbnailQueryString = "&videoThumbnail=1";
895 }
896 }
897
898 return getImageSrc(
899 fileEntry, fileVersion, themeDisplay, thumbnailQueryString);
900 }
901
902 @Override
903 public String getThumbnailStyle() throws Exception {
904 return getThumbnailStyle(true, 0);
905 }
906
907 @Override
908 public String getThumbnailStyle(boolean max, int margin) throws Exception {
909 StringBundler sb = new StringBundler(5);
910
911 if (max) {
912 sb.append("max-height: ");
913 }
914 else {
915 sb.append("height: ");
916 }
917
918 sb.append(
919 PrefsPropsUtil.getLong(
920 PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_HEIGHT) + 2 * margin);
921
922 if (max) {
923 sb.append("px; max-width: ");
924 }
925 else {
926 sb.append("px; width: ");
927 }
928
929 sb.append(
930 PrefsPropsUtil.getLong(
931 PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_WIDTH) + 2 * margin);
932 sb.append("px;");
933
934 return sb.toString();
935 }
936
937 @Override
938 public String getTitleWithExtension(FileEntry fileEntry) {
939 String title = fileEntry.getTitle();
940 String extension = fileEntry.getExtension();
941
942 return getTitleWithExtension(title, extension);
943 }
944
945 @Override
946 public String getTitleWithExtension(String title, String extension) {
947 if (Validator.isNotNull(extension)) {
948 String periodAndExtension = StringPool.PERIOD + extension;
949
950 if (!title.endsWith(periodAndExtension)) {
951 title += periodAndExtension;
952 }
953 }
954
955 return title;
956 }
957
958 @Override
959 public String getWebDavURL(
960 ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry)
961 throws PortalException, SystemException {
962
963 return getWebDavURL(themeDisplay, folder, fileEntry, false);
964 }
965
966 @Override
967 public String getWebDavURL(
968 ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry,
969 boolean manualCheckInRequired)
970 throws PortalException, SystemException {
971
972 return getWebDavURL(
973 themeDisplay, folder, fileEntry, manualCheckInRequired, false);
974 }
975
976 @Override
977 public String getWebDavURL(
978 ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry,
979 boolean manualCheckInRequired, boolean openDocumentUrl)
980 throws PortalException, SystemException {
981
982 StringBundler webDavURL = new StringBundler(8);
983
984 boolean secure = false;
985
986 if (themeDisplay.isSecure() ||
987 PropsValues.WEBDAV_SERVLET_HTTPS_REQUIRED) {
988
989 secure = true;
990 }
991
992 String portalURL = PortalUtil.getPortalURL(
993 themeDisplay.getServerName(), themeDisplay.getServerPort(), secure);
994
995 webDavURL.append(portalURL);
996
997 webDavURL.append(themeDisplay.getPathContext());
998 webDavURL.append("/webdav");
999
1000 if (manualCheckInRequired) {
1001 webDavURL.append(MANUAL_CHECK_IN_REQUIRED_PATH);
1002 }
1003
1004 String fileEntryTitle = null;
1005
1006 if (fileEntry != null) {
1007 String extension = fileEntry.getExtension();
1008
1009 fileEntryTitle = HtmlUtil.unescape(fileEntry.getTitle());
1010
1011 if (openDocumentUrl && isOfficeExtension(extension) &&
1012 !fileEntryTitle.endsWith(StringPool.PERIOD + extension)) {
1013
1014 webDavURL.append(OFFICE_EXTENSION_PATH);
1015
1016 fileEntryTitle += StringPool.PERIOD + extension;
1017 }
1018 }
1019
1020 Group group = themeDisplay.getScopeGroup();
1021
1022 webDavURL.append(group.getFriendlyURL());
1023 webDavURL.append("/document_library");
1024
1025 StringBuilder sb = new StringBuilder();
1026
1027 if ((folder != null) &&
1028 (folder.getFolderId() !=
1029 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)) {
1030
1031 Folder curFolder = folder;
1032
1033 while (true) {
1034 sb.insert(0, HttpUtil.encodeURL(curFolder.getName(), true));
1035 sb.insert(0, StringPool.SLASH);
1036
1037 if (curFolder.getParentFolderId() ==
1038 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
1039
1040 break;
1041 }
1042
1043 curFolder = DLAppLocalServiceUtil.getFolder(
1044 curFolder.getParentFolderId());
1045 }
1046 }
1047
1048 if (fileEntry != null) {
1049 sb.append(StringPool.SLASH);
1050 sb.append(HttpUtil.encodeURL(fileEntryTitle, true));
1051 }
1052
1053 webDavURL.append(sb.toString());
1054
1055 return webDavURL.toString();
1056 }
1057
1058 @Override
1059 public boolean hasWorkflowDefinitionLink(
1060 long companyId, long groupId, long folderId, long fileEntryTypeId)
1061 throws Exception {
1062
1063 while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
1064 DLFolder dlFolder = DLFolderLocalServiceUtil.fetchDLFolder(
1065 folderId);
1066
1067 if (dlFolder == null) {
1068 return false;
1069 }
1070
1071 if (dlFolder.isOverrideFileEntryTypes()) {
1072 break;
1073 }
1074
1075 folderId = dlFolder.getParentFolderId();
1076 }
1077
1078 if (WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(
1079 companyId, groupId, DLFolderConstants.getClassName(), folderId,
1080 fileEntryTypeId) ||
1081 WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(
1082 companyId, groupId, DLFolderConstants.getClassName(), folderId,
1083 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_ALL)) {
1084
1085 return true;
1086 }
1087
1088 return false;
1089 }
1090
1091 @Override
1092 public boolean isAutoGeneratedDLFileEntryTypeDDMStructureKey(
1093 String ddmStructureKey) {
1094
1095 if (ddmStructureKey.startsWith(_STRUCTURE_KEY_PREFIX)) {
1096 return true;
1097 }
1098
1099 return false;
1100 }
1101
1102 @Override
1103 public boolean isOfficeExtension(String extension) {
1104 if (extension.equalsIgnoreCase("doc") ||
1105 extension.equalsIgnoreCase("docx") ||
1106 extension.equalsIgnoreCase("dot") ||
1107 extension.equalsIgnoreCase("ppt") ||
1108 extension.equalsIgnoreCase("pptx") ||
1109 extension.equalsIgnoreCase("xls") ||
1110 extension.equalsIgnoreCase("xlsx")) {
1111
1112 return true;
1113 }
1114
1115 return false;
1116 }
1117
1118 @Override
1119 public boolean isSubscribedToFileEntryType(
1120 long companyId, long groupId, long userId, long fileEntryTypeId)
1121 throws SystemException {
1122
1123 if (fileEntryTypeId ==
1124 DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) {
1125
1126 fileEntryTypeId = groupId;
1127 }
1128
1129 return SubscriptionLocalServiceUtil.isSubscribed(
1130 companyId, userId, DLFileEntryType.class.getName(),
1131 fileEntryTypeId);
1132 }
1133
1134 @Override
1135 public boolean isSubscribedToFolder(
1136 long companyId, long groupId, long userId, long folderId)
1137 throws PortalException, SystemException {
1138
1139 return isSubscribedToFolder(companyId, groupId, userId, folderId, true);
1140 }
1141
1142 @Override
1143 public boolean isSubscribedToFolder(
1144 long companyId, long groupId, long userId, long folderId,
1145 boolean recursive)
1146 throws PortalException, SystemException {
1147
1148 List<Long> ancestorFolderIds = new ArrayList<Long>();
1149
1150 if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
1151 Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
1152
1153 if (recursive) {
1154 ancestorFolderIds = folder.getAncestorFolderIds();
1155
1156 ancestorFolderIds.add(groupId);
1157 }
1158
1159 ancestorFolderIds.add(0, folderId);
1160 }
1161 else {
1162 ancestorFolderIds.add(groupId);
1163 }
1164
1165 long[] folderIdsArray = ArrayUtil.toLongArray(ancestorFolderIds);
1166
1167 return SubscriptionLocalServiceUtil.isSubscribed(
1168 companyId, userId, Folder.class.getName(), folderIdsArray);
1169 }
1170
1171 protected long getDefaultFolderId(HttpServletRequest request)
1172 throws Exception {
1173
1174 PortletPreferences portletPreferences =
1175 PortletPreferencesFactoryUtil.getPortletPreferences(
1176 request, PortalUtil.getPortletId(request));
1177
1178 return GetterUtil.getLong(
1179 portletPreferences.getValue(
1180 "rootFolderId",
1181 String.valueOf(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)));
1182 }
1183
1184 protected String getImageSrc(
1185 FileEntry fileEntry, FileVersion fileVersion,
1186 ThemeDisplay themeDisplay, String queryString)
1187 throws Exception {
1188
1189 StringBundler sb = new StringBundler(4);
1190
1191 sb.append(themeDisplay.getPathThemeImages());
1192 sb.append("/file_system/large/");
1193 sb.append(getGenericName(fileEntry.getExtension()));
1194 sb.append(".png");
1195
1196 String thumbnailSrc = sb.toString();
1197
1198 if (Validator.isNotNull(queryString)) {
1199 thumbnailSrc = getPreviewURL(
1200 fileEntry, fileVersion, themeDisplay, queryString, true, true);
1201 }
1202
1203 return thumbnailSrc;
1204 }
1205
1206 private static void _populateGenericNamesMap(String genericName) {
1207 String[] extensions = PropsUtil.getArray(
1208 PropsKeys.DL_FILE_GENERIC_EXTENSIONS, new Filter(genericName));
1209
1210 for (String extension : extensions) {
1211 _genericNames.put(extension, genericName);
1212 }
1213 }
1214
1215 private static final String _DEFAULT_FILE_ICON = "page";
1216
1217 private static final String _DEFAULT_GENERIC_NAME = "default";
1218
1219 private static final long _DIVISOR = 256;
1220
1221 private static final String _STRUCTURE_KEY_PREFIX = "AUTO_";
1222
1223 private static Log _log = LogFactoryUtil.getLog(DLImpl.class);
1224
1225 private static Set<String> _allMediaGalleryMimeTypes =
1226 new TreeSet<String>();
1227 private static String _allMediaGalleryMimeTypesString;
1228 private static Set<String> _fileIcons = new HashSet<String>();
1229 private static Map<String, String> _genericNames =
1230 new HashMap<String, String>();
1231
1232 static {
1233 _allMediaGalleryMimeTypes.addAll(
1234 SetUtil.fromArray(
1235 PropsUtil.getArray(
1236 PropsKeys.DL_FILE_ENTRY_PREVIEW_AUDIO_MIME_TYPES)));
1237 _allMediaGalleryMimeTypes.addAll(
1238 SetUtil.fromArray(
1239 PropsUtil.getArray(
1240 PropsKeys.DL_FILE_ENTRY_PREVIEW_VIDEO_MIME_TYPES)));
1241 _allMediaGalleryMimeTypes.addAll(
1242 SetUtil.fromArray(
1243 PropsUtil.getArray(
1244 PropsKeys.DL_FILE_ENTRY_PREVIEW_IMAGE_MIME_TYPES)));
1245
1246 _allMediaGalleryMimeTypesString = StringUtil.merge(
1247 _allMediaGalleryMimeTypes);
1248
1249 String[] fileIcons = null;
1250
1251 try {
1252 fileIcons = PropsUtil.getArray(PropsKeys.DL_FILE_ICONS);
1253 }
1254 catch (Exception e) {
1255 if (_log.isDebugEnabled()) {
1256 _log.debug(e, e);
1257 }
1258
1259 fileIcons = new String[] {StringPool.BLANK};
1260 }
1261
1262 for (int i = 0; i < fileIcons.length; i++) {
1263
1264
1265
1266 if (!StringPool.STAR.equals(fileIcons[i])) {
1267
1268
1269
1270 String extension = fileIcons[i];
1271
1272 if (extension.length() > 0) {
1273 extension = extension.substring(1);
1274 }
1275
1276 _fileIcons.add(extension);
1277 }
1278 }
1279
1280 String[] genericNames = PropsUtil.getArray(
1281 PropsKeys.DL_FILE_GENERIC_NAMES);
1282
1283 for (String genericName : genericNames) {
1284 _populateGenericNamesMap(genericName);
1285 }
1286 }
1287
1288 }