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.util.GetterUtil;
028 import com.liferay.portal.kernel.util.HtmlUtil;
029 import com.liferay.portal.kernel.util.HttpUtil;
030 import com.liferay.portal.kernel.util.OrderByComparator;
031 import com.liferay.portal.kernel.util.ParamUtil;
032 import com.liferay.portal.kernel.util.PrefsParamUtil;
033 import com.liferay.portal.kernel.util.PrefsPropsUtil;
034 import com.liferay.portal.kernel.util.PropsKeys;
035 import com.liferay.portal.kernel.util.PropsUtil;
036 import com.liferay.portal.kernel.util.SetUtil;
037 import com.liferay.portal.kernel.util.StringBundler;
038 import com.liferay.portal.kernel.util.StringPool;
039 import com.liferay.portal.kernel.util.StringUtil;
040 import com.liferay.portal.kernel.util.Validator;
041 import com.liferay.portal.kernel.util.WebKeys;
042 import com.liferay.portal.model.Group;
043 import com.liferay.portal.service.GroupLocalServiceUtil;
044 import com.liferay.portal.theme.ThemeDisplay;
045 import com.liferay.portal.util.PortalUtil;
046 import com.liferay.portlet.PortletPreferencesFactoryUtil;
047 import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
048 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
049 import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
050 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelCreateDateComparator;
051 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelModifiedDateComparator;
052 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelNameComparator;
053 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelReadCountComparator;
054 import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelSizeComparator;
055
056 import java.util.Arrays;
057 import java.util.Collections;
058 import java.util.Date;
059 import java.util.HashMap;
060 import java.util.HashSet;
061 import java.util.List;
062 import java.util.Map;
063 import java.util.Set;
064 import java.util.TreeSet;
065
066 import javax.portlet.PortletPreferences;
067 import javax.portlet.PortletRequest;
068 import javax.portlet.PortletURL;
069 import javax.portlet.RenderResponse;
070
071 import javax.servlet.http.HttpServletRequest;
072
073
077 public class DLUtil {
078
079 public static void addPortletBreadcrumbEntries(
080 DLFileShortcut dlFileShortcut, HttpServletRequest request,
081 RenderResponse renderResponse)
082 throws Exception {
083
084 Folder folder = dlFileShortcut.getFolder();
085
086 if (folder.getFolderId() !=
087 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
088
089 addPortletBreadcrumbEntries(folder, request, renderResponse);
090 }
091
092 PortletURL portletURL = renderResponse.createRenderURL();
093
094 portletURL.setParameter(
095 "struts_action", "/document_library/view_file_entry");
096 portletURL.setParameter(
097 "fileEntryId", String.valueOf(dlFileShortcut.getToFileEntryId()));
098
099 PortalUtil.addPortletBreadcrumbEntry(
100 request, dlFileShortcut.getToTitle(), portletURL.toString());
101 }
102
103 public static void addPortletBreadcrumbEntries(
104 FileEntry fileEntry, HttpServletRequest request,
105 RenderResponse renderResponse)
106 throws Exception {
107
108 Folder folder = fileEntry.getFolder();
109
110 if (folder.getFolderId() !=
111 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
112
113 addPortletBreadcrumbEntries(folder, request, renderResponse);
114 }
115
116 PortletURL portletURL = renderResponse.createRenderURL();
117
118 portletURL.setParameter(
119 "struts_action", "/document_library/view_file_entry");
120 portletURL.setParameter(
121 "fileEntryId", String.valueOf(fileEntry.getFileEntryId()));
122
123 PortalUtil.addPortletBreadcrumbEntry(
124 request, fileEntry.getTitle(), portletURL.toString());
125 }
126
127 public static void addPortletBreadcrumbEntries(
128 Folder folder, HttpServletRequest request,
129 LiferayPortletResponse liferayPortletResponse)
130 throws Exception {
131
132 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
133 WebKeys.THEME_DISPLAY);
134
135 PortletURL portletURL = liferayPortletResponse.createRenderURL();
136
137 portletURL.setParameter("struts_action", "/document_library/view");
138
139 Map<String, Object> data = new HashMap<String, Object>();
140
141 data.put("direction-right", Boolean.TRUE.toString());
142 data.put("folder-id", _getDefaultFolderId(request));
143
144 PortalUtil.addPortletBreadcrumbEntry(
145 request, themeDisplay.translate("home"), portletURL.toString(),
146 data);
147
148 addPortletBreadcrumbEntries(folder, request, portletURL);
149 }
150
151 public static void addPortletBreadcrumbEntries(
152 Folder folder, HttpServletRequest request, PortletURL portletURL)
153 throws Exception {
154
155 long defaultFolderId = _getDefaultFolderId(request);
156
157 List<Folder> ancestorFolders = Collections.emptyList();
158
159 if ((folder != null) && (folder.getFolderId() != defaultFolderId)) {
160 ancestorFolders = folder.getAncestors();
161
162 int indexOfRootFolder = -1;
163
164 for (int i = 0; i < ancestorFolders.size(); i++) {
165 Folder ancestorFolder = ancestorFolders.get(i);
166
167 if (defaultFolderId == ancestorFolder.getFolderId()) {
168 indexOfRootFolder = i;
169 }
170 }
171
172 if (indexOfRootFolder > -1) {
173 ancestorFolders = ancestorFolders.subList(0, indexOfRootFolder);
174 }
175 }
176
177 Collections.reverse(ancestorFolders);
178
179 for (Folder ancestorFolder : ancestorFolders) {
180 portletURL.setParameter(
181 "folderId", String.valueOf(ancestorFolder.getFolderId()));
182
183 Map<String, Object> data = new HashMap<String, Object>();
184
185 data.put("direction-right", Boolean.TRUE.toString());
186 data.put("folder-id", ancestorFolder.getFolderId());
187
188 PortalUtil.addPortletBreadcrumbEntry(
189 request, ancestorFolder.getName(), portletURL.toString(), data);
190 }
191
192 long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
193
194 if (folder != null) {
195 folderId = folder.getFolderId();
196 }
197
198 portletURL.setParameter("folderId", String.valueOf(folderId));
199
200 if ((folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
201 (folderId != defaultFolderId)) {
202
203 Map<String, Object> data = new HashMap<String, Object>();
204
205 data.put("direction-right", Boolean.TRUE.toString());
206 data.put("folder-id", folderId);
207
208 PortalUtil.addPortletBreadcrumbEntry(
209 request, folder.getName(), portletURL.toString(), data);
210 }
211 }
212
213 public static void addPortletBreadcrumbEntries(
214 Folder folder, HttpServletRequest request,
215 RenderResponse renderResponse)
216 throws Exception {
217
218 String strutsAction = ParamUtil.getString(request, "struts_action");
219
220 long groupId = ParamUtil.getLong(request, "groupId");
221
222 PortletURL portletURL = renderResponse.createRenderURL();
223
224 if (strutsAction.equals("/journal/select_document_library") ||
225 strutsAction.equals("/document_library/select_file_entry") ||
226 strutsAction.equals("/document_library/select_folder") ||
227 strutsAction.equals("/document_library_display/select_folder") ||
228 strutsAction.equals("/image_gallery_display/select_folder")) {
229
230 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
231 WebKeys.THEME_DISPLAY);
232
233 portletURL.setWindowState(LiferayWindowState.POP_UP);
234
235 portletURL.setParameter("struts_action", strutsAction);
236 portletURL.setParameter("groupId", String.valueOf(groupId));
237
238 PortalUtil.addPortletBreadcrumbEntry(
239 request, themeDisplay.translate("home"), portletURL.toString());
240 }
241 else {
242 portletURL.setParameter("struts_action", "/document_library/view");
243 }
244
245 addPortletBreadcrumbEntries(folder, request, portletURL);
246 }
247
248 public static void addPortletBreadcrumbEntries(
249 long folderId, HttpServletRequest request,
250 RenderResponse renderResponse)
251 throws Exception {
252
253 if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
254 Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
255
256 if (folder.getFolderId() !=
257 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
258
259 addPortletBreadcrumbEntries(folder, request, renderResponse);
260 }
261 }
262 }
263
264 public static int compareVersions(String version1, String version2) {
265 int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0);
266 int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0);
267
268 if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) {
269 return 0;
270 }
271 else if ((splitVersion1.length != 2)) {
272 return -1;
273 }
274 else if ((splitVersion2.length != 2)) {
275 return 1;
276 }
277
278 if (splitVersion1[0] > splitVersion2[0]) {
279 return 1;
280 }
281 else if (splitVersion1[0] < splitVersion2[0]) {
282 return -1;
283 }
284 else if (splitVersion1[1] > splitVersion2[1]) {
285 return 1;
286 }
287 else if (splitVersion1[1] < splitVersion2[1]) {
288 return -1;
289 }
290
291 return 0;
292 }
293
294 public static Set<String> getAllMediaGalleryMimeTypes() {
295 return _instance._allMediaGalleryMimeTypes;
296 }
297
298 public static String getDividedPath(long id) {
299 StringBundler sb = new StringBundler(16);
300
301 long dividend = id;
302
303 while ((dividend / _DIVISOR) != 0) {
304 sb.append(StringPool.SLASH);
305 sb.append(dividend % _DIVISOR);
306
307 dividend = dividend / _DIVISOR;
308 }
309
310 sb.append(StringPool.SLASH);
311 sb.append(id);
312
313 return sb.toString();
314 }
315
316 public static String getFileEntryImage(
317 FileEntry fileEntry, ThemeDisplay themeDisplay) {
318
319 StringBundler sb = new StringBundler(5);
320
321 sb.append("<img style=\"border-width: 0; text-align: left;\" src=\"");
322 sb.append(themeDisplay.getPathThemeImages());
323 sb.append("/file_system/small/");
324 sb.append(fileEntry.getIcon());
325 sb.append(".png\">");
326
327 return sb.toString();
328 }
329
330 public static String getFileIcon(String extension) {
331 return _instance._getFileIcon(extension);
332 }
333
334 public static String getGenericName(String extension) {
335 return _instance._getGenericName(extension);
336 }
337
338 public static long[] getGroupIds(long groupId)
339 throws PortalException, SystemException {
340
341 Group scopeGroup = GroupLocalServiceUtil.getGroup(groupId);
342
343 Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
344 scopeGroup.getCompanyId());
345
346 if (scopeGroup.isLayout()) {
347 return new long[] {
348 scopeGroup.getParentGroupId(), companyGroup.getGroupId()
349 };
350 }
351 else {
352 return new long[] {groupId, companyGroup.getGroupId()};
353 }
354 }
355
356 public static long[] getGroupIds(ThemeDisplay themeDisplay)
357 throws PortalException, SystemException {
358
359 return getGroupIds(themeDisplay.getScopeGroupId());
360 }
361
362 public static String[] getMediaGalleryMimeTypes(
363 PortletPreferences portletPreferences, PortletRequest portletRequest) {
364
365 String mimeTypes = PrefsParamUtil.getString(
366 portletPreferences, portletRequest, "mimeTypes",
367 _instance._allMediaGalleryMimeTypesString);
368
369 String[] mimeTypesArray = StringUtil.split(mimeTypes);
370
371 Arrays.sort(mimeTypesArray);
372
373 return mimeTypesArray;
374 }
375
376 public static String getPreviewURL(
377 FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
378 String queryString) {
379
380 return getPreviewURL(
381 fileEntry, fileVersion, themeDisplay, queryString, true, true);
382 }
383
384
388 public static String getPreviewURL(
389 FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
390 String queryString, boolean appendToken) {
391
392 return getPreviewURL(
393 fileEntry, fileVersion, themeDisplay, queryString, true, true);
394 }
395
396 public static String getPreviewURL(
397 FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
398 String queryString, boolean appendVersion, boolean absoluteURL) {
399
400 StringBundler sb = new StringBundler(15);
401
402 if (absoluteURL) {
403 sb.append(themeDisplay.getPortalURL());
404 sb.append(themeDisplay.getPathContext());
405 }
406
407 sb.append("/documents/");
408 sb.append(fileEntry.getRepositoryId());
409 sb.append(StringPool.SLASH);
410 sb.append(fileEntry.getFolderId());
411 sb.append(StringPool.SLASH);
412 sb.append(HttpUtil.encodeURL(HtmlUtil.unescape(fileEntry.getTitle())));
413 sb.append(StringPool.SLASH);
414 sb.append(fileEntry.getUuid());
415
416 if (appendVersion) {
417 sb.append("?version=");
418 sb.append(fileVersion.getVersion());
419 }
420
421 if (ImageProcessorUtil.isImageSupported(fileVersion)) {
422 if (appendVersion) {
423 sb.append("&t=");
424 }
425 else {
426 sb.append("?t=");
427 }
428
429 Date modifiedDate = fileVersion.getModifiedDate();
430
431 sb.append(modifiedDate.getTime());
432 }
433
434 sb.append(queryString);
435
436 String previewURL = sb.toString();
437
438 if ((themeDisplay != null) && (themeDisplay.isAddSessionIdToURL())) {
439 return PortalUtil.getURLWithSessionId(
440 previewURL, themeDisplay.getSessionId());
441 }
442
443 return previewURL;
444 }
445
446 public static OrderByComparator getRepositoryModelOrderByComparator(
447 String orderByCol, String orderByType) {
448
449 boolean orderByAsc = true;
450
451 if (orderByType.equals("desc")) {
452 orderByAsc = false;
453 }
454
455 OrderByComparator orderByComparator = null;
456
457 if (orderByCol.equals("creationDate")) {
458 orderByComparator = new RepositoryModelCreateDateComparator(
459 orderByAsc);
460 }
461 else if (orderByCol.equals("downloads")) {
462 orderByComparator = new RepositoryModelReadCountComparator(
463 orderByAsc);
464 }
465 else if (orderByCol.equals("modifiedDate")) {
466 orderByComparator = new RepositoryModelModifiedDateComparator(
467 orderByAsc);
468 }
469 else if (orderByCol.equals("size")) {
470 orderByComparator = new RepositoryModelSizeComparator(orderByAsc);
471 }
472 else {
473 orderByComparator = new RepositoryModelNameComparator(orderByAsc);
474 }
475
476 return orderByComparator;
477 }
478
479 public static String getTempFileId(long id, String version) {
480 return getTempFileId(id, version, null);
481 }
482
483 public static String getTempFileId(
484 long id, String version, String languageId) {
485
486 if (Validator.isNull(languageId)) {
487 return String.valueOf(id).concat(StringPool.PERIOD).concat(version);
488 }
489
490 StringBundler sb = new StringBundler(5);
491
492 sb.append(id);
493 sb.append(StringPool.PERIOD);
494 sb.append(version);
495 sb.append(StringPool.PERIOD);
496 sb.append(languageId);
497
498 return sb.toString();
499 }
500
501 public static String getThumbnailSrc(
502 FileEntry fileEntry, DLFileShortcut dlFileShortcut,
503 ThemeDisplay themeDisplay)
504 throws Exception {
505
506 return getThumbnailSrc(
507 fileEntry, fileEntry.getFileVersion(), dlFileShortcut,
508 themeDisplay);
509 }
510
511 public static String getThumbnailSrc(
512 FileEntry fileEntry, FileVersion fileVersion,
513 DLFileShortcut dlFileShortcut, ThemeDisplay themeDisplay)
514 throws Exception {
515
516 StringBundler sb = new StringBundler(4);
517
518 sb.append(themeDisplay.getPathThemeImages());
519 sb.append("/file_system/large/");
520 sb.append(DLUtil.getGenericName(fileEntry.getExtension()));
521 sb.append(".png");
522
523 String thumbnailSrc = sb.toString();
524
525 if (dlFileShortcut == null) {
526 String thumbnailQueryString = null;
527
528 if (ImageProcessorUtil.hasImages(fileVersion)) {
529 thumbnailQueryString = "&imageThumbnail=1";
530 }
531 else if (PDFProcessorUtil.hasImages(fileVersion)) {
532 thumbnailQueryString = "&documentThumbnail=1";
533 }
534 else if (VideoProcessorUtil.hasVideo(fileVersion)) {
535 thumbnailQueryString = "&videoThumbnail=1";
536 }
537
538 if (Validator.isNotNull(thumbnailQueryString)) {
539 thumbnailSrc = getPreviewURL(
540 fileEntry, fileVersion, themeDisplay, thumbnailQueryString,
541 true, true);
542 }
543 }
544
545 return thumbnailSrc;
546 }
547
548 public static String getThumbnailStyle() throws Exception {
549 StringBundler sb = new StringBundler(5);
550
551 sb.append("max-height: ");
552 sb.append(
553 PrefsPropsUtil.getLong(
554 PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_HEIGHT));
555 sb.append("px; max-width: ");
556 sb.append(
557 PrefsPropsUtil.getLong(
558 PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_WIDTH));
559 sb.append("px;");
560
561 return sb.toString();
562 }
563
564 public static String getTitleWithExtension(FileEntry fileEntry) {
565 String title = fileEntry.getTitle();
566 String extension = fileEntry.getExtension();
567
568 if (Validator.isNotNull(extension)) {
569 String periodAndExtension = StringPool.PERIOD + extension;
570
571 if (!title.endsWith(periodAndExtension)) {
572 title += periodAndExtension;
573 }
574 }
575
576 return title;
577 }
578
579 public static String getWebDavURL(
580 ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry)
581 throws PortalException, SystemException {
582
583 StringBuilder sb = new StringBuilder();
584
585 if (folder != null) {
586 Folder curFolder = folder;
587
588 while (true) {
589 sb.insert(0, HttpUtil.encodeURL(curFolder.getName(), true));
590 sb.insert(0, StringPool.SLASH);
591
592 if (curFolder.getParentFolderId() ==
593 DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
594
595 break;
596 }
597 else {
598 curFolder = DLAppLocalServiceUtil.getFolder(
599 curFolder.getParentFolderId());
600 }
601 }
602 }
603
604 if (fileEntry != null) {
605 sb.append(StringPool.SLASH);
606 sb.append(HttpUtil.encodeURL(fileEntry.getTitle(), true));
607 }
608
609 Group group = themeDisplay.getScopeGroup();
610
611 return themeDisplay.getPortalURL() + themeDisplay.getPathContext() +
612 "/api/secure/webdav" + group.getFriendlyURL() +
613 "/document_library" + sb.toString();
614 }
615
616 private static long _getDefaultFolderId(HttpServletRequest request)
617 throws Exception {
618
619 PortletPreferences portletPreferences =
620 PortletPreferencesFactoryUtil.getPortletPreferences(
621 request, PortalUtil.getPortletId(request));
622
623 return GetterUtil.getLong(
624 portletPreferences.getValue(
625 "rootFolderId",
626 String.valueOf(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)));
627 }
628
629 private DLUtil() {
630 _allMediaGalleryMimeTypes.addAll(
631 SetUtil.fromArray(
632 PropsUtil.getArray(
633 PropsKeys.DL_FILE_ENTRY_PREVIEW_AUDIO_MIME_TYPES)));
634 _allMediaGalleryMimeTypes.addAll(
635 SetUtil.fromArray(
636 PropsUtil.getArray(
637 PropsKeys.DL_FILE_ENTRY_PREVIEW_VIDEO_MIME_TYPES)));
638 _allMediaGalleryMimeTypes.addAll(
639 SetUtil.fromArray(
640 PropsUtil.getArray(
641 PropsKeys.DL_FILE_ENTRY_PREVIEW_IMAGE_MIME_TYPES)));
642
643 _allMediaGalleryMimeTypesString = StringUtil.merge(
644 _allMediaGalleryMimeTypes);
645
646 String[] fileIcons = null;
647
648 try {
649 fileIcons = PrefsPropsUtil.getStringArray(
650 PropsKeys.DL_FILE_ICONS, StringPool.COMMA);
651 }
652 catch (Exception e) {
653 _log.error(e, e);
654
655 fileIcons = new String[] {StringPool.BLANK};
656 }
657
658 for (int i = 0; i < fileIcons.length; i++) {
659
660
661
662 if (!StringPool.STAR.equals(fileIcons[i])) {
663
664
665
666 String extension = fileIcons[i];
667 extension = extension.substring(1, extension.length());
668
669 _fileIcons.add(extension);
670 }
671 }
672
673 String[] genericNames = PropsUtil.getArray(
674 PropsKeys.DL_FILE_GENERIC_NAMES);
675
676 for (String genericName : genericNames) {
677 _populateGenericNamesMap(genericName);
678 }
679 }
680
681 private String _getFileIcon(String extension) {
682 if (!_fileIcons.contains(extension)) {
683 extension = _DEFAULT_FILE_ICON;
684 }
685
686 return extension;
687 }
688
689 private String _getGenericName(String extension) {
690 String genericName = _genericNames.get(extension);
691
692 if (genericName == null) {
693 genericName = _DEFAULT_GENERIC_NAME;
694 }
695
696 return genericName;
697 }
698
699 private void _populateGenericNamesMap(String genericName) {
700 String[] extensions = PropsUtil.getArray(
701 PropsKeys.DL_FILE_GENERIC_EXTENSIONS, new Filter(genericName));
702
703 for (String extension : extensions) {
704 _genericNames.put(extension, genericName);
705 }
706 }
707
708 private static final String _DEFAULT_FILE_ICON = "page";
709
710 private static final String _DEFAULT_GENERIC_NAME = "default";
711
712 private static final long _DIVISOR = 256;;
713
714 private static Log _log = LogFactoryUtil.getLog(DLUtil.class);
715
716 private static DLUtil _instance = new DLUtil();
717
718 private Set<String> _allMediaGalleryMimeTypes = new TreeSet<String>();
719 private String _allMediaGalleryMimeTypesString;
720 private Set<String> _fileIcons = new HashSet<String>();
721 private Map<String, String> _genericNames = new HashMap<String, String>();
722
723 }