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