001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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.kernel.workflow.WorkflowConstants;
043    import com.liferay.portal.model.Group;
044    import com.liferay.portal.service.WorkflowDefinitionLinkLocalServiceUtil;
045    import com.liferay.portal.theme.PortletDisplay;
046    import com.liferay.portal.theme.ThemeDisplay;
047    import com.liferay.portal.util.PortalUtil;
048    import com.liferay.portal.util.PortletKeys;
049    import com.liferay.portlet.PortletPreferencesFactoryUtil;
050    import com.liferay.portlet.PortletURLFactoryUtil;
051    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
052    import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
053    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
054    import com.liferay.portlet.documentlibrary.model.DLFolder;
055    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
056    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
057    import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
058    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelCreateDateComparator;
059    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelModifiedDateComparator;
060    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelNameComparator;
061    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelReadCountComparator;
062    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelSizeComparator;
063    
064    import java.util.Arrays;
065    import java.util.Collections;
066    import java.util.Date;
067    import java.util.HashMap;
068    import java.util.HashSet;
069    import java.util.List;
070    import java.util.Map;
071    import java.util.Set;
072    import java.util.TreeSet;
073    
074    import javax.portlet.PortletPreferences;
075    import javax.portlet.PortletRequest;
076    import javax.portlet.PortletURL;
077    import javax.portlet.RenderResponse;
078    
079    import javax.servlet.http.HttpServletRequest;
080    
081    /**
082     * @author Brian Wing Shun Chan
083     * @author Julio Camarero
084     */
085    public class DLUtil {
086    
087            public static final String MANUAL_CHECK_IN_REQUIRED =
088                    "manualCheckInRequired";
089    
090            public static final String MANUAL_CHECK_IN_REQUIRED_PATH =
091                    StringPool.SLASH + MANUAL_CHECK_IN_REQUIRED;
092    
093            public static final String WEBDAV_CHECK_IN_MODE = "webDAVCheckInMode";
094    
095            public static void addPortletBreadcrumbEntries(
096                            DLFileShortcut dlFileShortcut, HttpServletRequest request,
097                            RenderResponse renderResponse)
098                    throws Exception {
099    
100                    Folder folder = dlFileShortcut.getFolder();
101    
102                    if (folder.getFolderId() !=
103                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
104    
105                            addPortletBreadcrumbEntries(folder, request, renderResponse);
106                    }
107    
108                    PortletURL portletURL = renderResponse.createRenderURL();
109    
110                    portletURL.setParameter(
111                            "struts_action", "/document_library/view_file_entry");
112                    portletURL.setParameter(
113                            "fileEntryId", String.valueOf(dlFileShortcut.getToFileEntryId()));
114    
115                    PortalUtil.addPortletBreadcrumbEntry(
116                            request, dlFileShortcut.getToTitle(), portletURL.toString());
117            }
118    
119            public static void addPortletBreadcrumbEntries(
120                            FileEntry fileEntry, HttpServletRequest request,
121                            RenderResponse renderResponse)
122                    throws Exception {
123    
124                    Folder folder = fileEntry.getFolder();
125    
126                    if (folder.getFolderId() !=
127                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
128    
129                            addPortletBreadcrumbEntries(folder, request, renderResponse);
130                    }
131    
132                    PortletURL portletURL = renderResponse.createRenderURL();
133    
134                    portletURL.setParameter(
135                            "struts_action", "/document_library/view_file_entry");
136                    portletURL.setParameter(
137                            "fileEntryId", String.valueOf(fileEntry.getFileEntryId()));
138    
139                    PortalUtil.addPortletBreadcrumbEntry(
140                            request, fileEntry.getTitle(), portletURL.toString());
141            }
142    
143            public static void addPortletBreadcrumbEntries(
144                            Folder folder, HttpServletRequest request,
145                            LiferayPortletResponse liferayPortletResponse)
146                    throws Exception {
147    
148                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
149                            WebKeys.THEME_DISPLAY);
150    
151                    PortletURL portletURL = liferayPortletResponse.createRenderURL();
152    
153                    portletURL.setParameter("struts_action", "/document_library/view");
154    
155                    Map<String, Object> data = new HashMap<String, Object>();
156    
157                    data.put("direction-right", Boolean.TRUE.toString());
158                    data.put("folder-id", _getDefaultFolderId(request));
159    
160                    PortalUtil.addPortletBreadcrumbEntry(
161                            request, themeDisplay.translate("home"), portletURL.toString(),
162                            data);
163    
164                    addPortletBreadcrumbEntries(folder, request, portletURL);
165            }
166    
167            public static void addPortletBreadcrumbEntries(
168                            Folder folder, HttpServletRequest request, PortletURL portletURL)
169                    throws Exception {
170    
171                    long defaultFolderId = _getDefaultFolderId(request);
172    
173                    List<Folder> ancestorFolders = Collections.emptyList();
174    
175                    if ((folder != null) && (folder.getFolderId() != defaultFolderId)) {
176                            ancestorFolders = folder.getAncestors();
177    
178                            int indexOfRootFolder = -1;
179    
180                            for (int i = 0; i < ancestorFolders.size(); i++) {
181                                    Folder ancestorFolder = ancestorFolders.get(i);
182    
183                                    if (defaultFolderId == ancestorFolder.getFolderId()) {
184                                            indexOfRootFolder = i;
185                                    }
186                            }
187    
188                            if (indexOfRootFolder > -1) {
189                                    ancestorFolders = ancestorFolders.subList(0, indexOfRootFolder);
190                            }
191                    }
192    
193                    Collections.reverse(ancestorFolders);
194    
195                    for (Folder ancestorFolder : ancestorFolders) {
196                            portletURL.setParameter(
197                                    "folderId", String.valueOf(ancestorFolder.getFolderId()));
198    
199                            Map<String, Object> data = new HashMap<String, Object>();
200    
201                            data.put("direction-right", Boolean.TRUE.toString());
202                            data.put("folder-id", ancestorFolder.getFolderId());
203    
204                            PortalUtil.addPortletBreadcrumbEntry(
205                                    request, ancestorFolder.getName(), portletURL.toString(), data);
206                    }
207    
208                    long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
209    
210                    if (folder != null) {
211                            folderId = folder.getFolderId();
212                    }
213    
214                    portletURL.setParameter("folderId", String.valueOf(folderId));
215    
216                    if ((folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) &&
217                            (folderId != defaultFolderId)) {
218    
219                            Map<String, Object> data = new HashMap<String, Object>();
220    
221                            data.put("direction-right", Boolean.TRUE.toString());
222                            data.put("folder-id", folderId);
223    
224                            PortalUtil.addPortletBreadcrumbEntry(
225                                    request, folder.getName(), portletURL.toString(), data);
226                    }
227            }
228    
229            public static void addPortletBreadcrumbEntries(
230                            Folder folder, HttpServletRequest request,
231                            RenderResponse renderResponse)
232                    throws Exception {
233    
234                    String strutsAction = ParamUtil.getString(request, "struts_action");
235    
236                    long groupId = ParamUtil.getLong(request, "groupId");
237    
238                    PortletURL portletURL = renderResponse.createRenderURL();
239    
240                    if (strutsAction.equals("/journal/select_document_library") ||
241                            strutsAction.equals("/document_library/select_file_entry") ||
242                            strutsAction.equals("/document_library/select_folder") ||
243                            strutsAction.equals("/document_library_display/select_folder") ||
244                            strutsAction.equals("/image_gallery_display/select_folder")) {
245    
246                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
247                                    WebKeys.THEME_DISPLAY);
248    
249                            portletURL.setWindowState(LiferayWindowState.POP_UP);
250    
251                            portletURL.setParameter("struts_action", strutsAction);
252                            portletURL.setParameter("groupId", String.valueOf(groupId));
253    
254                            PortalUtil.addPortletBreadcrumbEntry(
255                                    request, themeDisplay.translate("home"), portletURL.toString());
256                    }
257                    else {
258                            portletURL.setParameter("struts_action", "/document_library/view");
259                    }
260    
261                    addPortletBreadcrumbEntries(folder, request, portletURL);
262            }
263    
264            public static void addPortletBreadcrumbEntries(
265                            long folderId, HttpServletRequest request,
266                            RenderResponse renderResponse)
267                    throws Exception {
268    
269                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
270                            Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
271    
272                            if (folder.getFolderId() !=
273                                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
274    
275                                    addPortletBreadcrumbEntries(folder, request, renderResponse);
276                            }
277                    }
278            }
279    
280            public static int compareVersions(String version1, String version2) {
281                    int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0);
282                    int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0);
283    
284                    if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) {
285                            return 0;
286                    }
287                    else if (splitVersion1.length != 2) {
288                            return -1;
289                    }
290                    else if (splitVersion2.length != 2) {
291                            return 1;
292                    }
293    
294                    if (splitVersion1[0] > splitVersion2[0]) {
295                            return 1;
296                    }
297                    else if (splitVersion1[0] < splitVersion2[0]) {
298                            return -1;
299                    }
300                    else if (splitVersion1[1] > splitVersion2[1]) {
301                            return 1;
302                    }
303                    else if (splitVersion1[1] < splitVersion2[1]) {
304                            return -1;
305                    }
306    
307                    return 0;
308            }
309    
310            public static String getAbsolutePath(
311                            PortletRequest portletRequest, long folderId)
312                    throws PortalException, SystemException {
313    
314                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
315                            WebKeys.THEME_DISPLAY);
316    
317                    if (folderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
318                            return themeDisplay.translate("home");
319                    }
320    
321                    DLFolder dlFolder = DLFolderLocalServiceUtil.getFolder(folderId);
322    
323                    List<DLFolder> dlFolders = dlFolder.getAncestors();
324    
325                    StringBundler sb = new StringBundler((dlFolders.size() * 3) + 6);
326    
327                    sb.append(themeDisplay.translate("home"));
328                    sb.append(StringPool.SPACE);
329    
330                    for (int i = dlFolders.size() - 1; i >= 0; i--) {
331                            DLFolder curDLFolder = dlFolders.get(i);
332    
333                            sb.append(StringPool.RAQUO);
334                            sb.append(StringPool.SPACE);
335                            sb.append(curDLFolder.getName());
336                    }
337    
338                    sb.append(StringPool.RAQUO);
339                    sb.append(StringPool.SPACE);
340                    sb.append(dlFolder.getName());
341    
342                    return sb.toString();
343            }
344    
345            public static Set<String> getAllMediaGalleryMimeTypes() {
346                    return _instance._allMediaGalleryMimeTypes;
347            }
348    
349            public static String getDDMStructureKey(DLFileEntryType dlFileEntryType) {
350                    return getDDMStructureKey(dlFileEntryType.getUuid());
351            }
352    
353            public static String getDDMStructureKey(String fileEntryTypeUuid) {
354                    return "auto_" + fileEntryTypeUuid;
355            }
356    
357            public static String getDeprecatedDDMStructureKey(
358                    DLFileEntryType dlFileEntryType) {
359    
360                    return getDeprecatedDDMStructureKey(
361                            dlFileEntryType.getFileEntryTypeId());
362            }
363    
364            public static String getDeprecatedDDMStructureKey(long fileEntryTypeId) {
365                    return "auto_" + fileEntryTypeId;
366            }
367    
368            public static String getDividedPath(long id) {
369                    StringBundler sb = new StringBundler(16);
370    
371                    long dividend = id;
372    
373                    while ((dividend / _DIVISOR) != 0) {
374                            sb.append(StringPool.SLASH);
375                            sb.append(dividend % _DIVISOR);
376    
377                            dividend = dividend / _DIVISOR;
378                    }
379    
380                    sb.append(StringPool.SLASH);
381                    sb.append(id);
382    
383                    return sb.toString();
384            }
385    
386            public static String getDLControlPanelLink(
387                            PortletRequest portletRequest, long folderId)
388                    throws PortalException, SystemException {
389    
390                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
391                            WebKeys.THEME_DISPLAY);
392    
393                    PortletURL portletURL = PortletURLFactoryUtil.create(
394                            portletRequest, PortletKeys.DOCUMENT_LIBRARY,
395                            PortalUtil.getControlPanelPlid(themeDisplay.getCompanyId()),
396                            PortletRequest.RENDER_PHASE);
397    
398                    portletURL.setParameter("struts_action", "/document_library/view");
399                    portletURL.setParameter("folderId", String.valueOf(folderId));
400    
401                    return portletURL.toString();
402            }
403    
404            public static String getFileEntryImage(
405                    FileEntry fileEntry, ThemeDisplay themeDisplay) {
406    
407                    StringBundler sb = new StringBundler(5);
408    
409                    sb.append("<img style=\"border-width: 0; text-align: left;\" src=\"");
410                    sb.append(themeDisplay.getPathThemeImages());
411                    sb.append("/file_system/small/");
412                    sb.append(fileEntry.getIcon());
413                    sb.append(".png\">");
414    
415                    return sb.toString();
416            }
417    
418            public static String getFileIcon(String extension) {
419                    return _instance._getFileIcon(extension);
420            }
421    
422            public static String getGenericName(String extension) {
423                    return _instance._getGenericName(extension);
424            }
425    
426            public static String[] getMediaGalleryMimeTypes(
427                    PortletPreferences portletPreferences, PortletRequest portletRequest) {
428    
429                    String mimeTypes = PrefsParamUtil.getString(
430                            portletPreferences, portletRequest, "mimeTypes",
431                            _instance._allMediaGalleryMimeTypesString);
432    
433                    String[] mimeTypesArray = StringUtil.split(mimeTypes);
434    
435                    Arrays.sort(mimeTypesArray);
436    
437                    return mimeTypesArray;
438            }
439    
440            public static String getPreviewURL(
441                    FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
442                    String queryString) {
443    
444                    return getPreviewURL(
445                            fileEntry, fileVersion, themeDisplay, queryString, true, true);
446            }
447    
448            /**
449             * @deprecated {@link #getPreviewURL(FileEntry, FileVersion, ThemeDisplay,
450             *             String, boolean, boolean)}
451             */
452            public static String getPreviewURL(
453                    FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
454                    String queryString, boolean appendToken) {
455    
456                    return getPreviewURL(
457                            fileEntry, fileVersion, themeDisplay, queryString, true, true);
458            }
459    
460            public static String getPreviewURL(
461                    FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay,
462                    String queryString, boolean appendVersion, boolean absoluteURL) {
463    
464                    StringBundler sb = new StringBundler(15);
465    
466                    if (themeDisplay != null) {
467                            if (absoluteURL) {
468                                    sb.append(themeDisplay.getPortalURL());
469                            }
470                    }
471    
472                    sb.append(PortalUtil.getPathContext());
473                    sb.append("/documents/");
474                    sb.append(fileEntry.getRepositoryId());
475                    sb.append(StringPool.SLASH);
476                    sb.append(fileEntry.getFolderId());
477                    sb.append(StringPool.SLASH);
478                    sb.append(HttpUtil.encodeURL(HtmlUtil.unescape(fileEntry.getTitle())));
479                    sb.append(StringPool.SLASH);
480                    sb.append(fileEntry.getUuid());
481    
482                    if (appendVersion) {
483                            sb.append("?version=");
484                            sb.append(fileVersion.getVersion());
485                    }
486    
487                    if (ImageProcessorUtil.isImageSupported(fileVersion)) {
488                            if (appendVersion) {
489                                    sb.append("&t=");
490                            }
491                            else {
492                                    sb.append("?t=");
493                            }
494    
495                            Date modifiedDate = fileVersion.getModifiedDate();
496    
497                            sb.append(modifiedDate.getTime());
498                    }
499    
500                    sb.append(queryString);
501    
502                    if (themeDisplay != null) {
503                            PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
504    
505                            if (portletDisplay != null) {
506                                    String portletId = portletDisplay.getId();
507    
508                                    if (portletId.equals(PortletKeys.TRASH)) {
509                                            sb.append("&status=");
510                                            sb.append(WorkflowConstants.STATUS_IN_TRASH);
511                                    }
512                            }
513                    }
514    
515                    String previewURL = sb.toString();
516    
517                    if ((themeDisplay != null) && themeDisplay.isAddSessionIdToURL()) {
518                            return PortalUtil.getURLWithSessionId(
519                                    previewURL, themeDisplay.getSessionId());
520                    }
521    
522                    return previewURL;
523            }
524    
525            public static OrderByComparator getRepositoryModelOrderByComparator(
526                    String orderByCol, String orderByType) {
527    
528                    boolean orderByAsc = true;
529    
530                    if (orderByType.equals("desc")) {
531                            orderByAsc = false;
532                    }
533    
534                    OrderByComparator orderByComparator = null;
535    
536                    if (orderByCol.equals("creationDate")) {
537                            orderByComparator = new RepositoryModelCreateDateComparator(
538                                    orderByAsc);
539                    }
540                    else if (orderByCol.equals("downloads")) {
541                            orderByComparator = new RepositoryModelReadCountComparator(
542                                    orderByAsc);
543                    }
544                    else if (orderByCol.equals("modifiedDate")) {
545                            orderByComparator = new RepositoryModelModifiedDateComparator(
546                                    orderByAsc);
547                    }
548                    else if (orderByCol.equals("size")) {
549                            orderByComparator = new RepositoryModelSizeComparator(orderByAsc);
550                    }
551                    else {
552                            orderByComparator = new RepositoryModelNameComparator(orderByAsc);
553                    }
554    
555                    return orderByComparator;
556            }
557    
558            public static String getTempFileId(long id, String version) {
559                    return getTempFileId(id, version, null);
560            }
561    
562            public static String getTempFileId(
563                    long id, String version, String languageId) {
564    
565                    if (Validator.isNull(languageId)) {
566                            return String.valueOf(id).concat(StringPool.PERIOD).concat(version);
567                    }
568    
569                    StringBundler sb = new StringBundler(5);
570    
571                    sb.append(id);
572                    sb.append(StringPool.PERIOD);
573                    sb.append(version);
574                    sb.append(StringPool.PERIOD);
575                    sb.append(languageId);
576    
577                    return sb.toString();
578            }
579    
580            public static String getThumbnailSrc(
581                            FileEntry fileEntry, DLFileShortcut dlFileShortcut,
582                            ThemeDisplay themeDisplay)
583                    throws Exception {
584    
585                    return getThumbnailSrc(
586                            fileEntry, fileEntry.getFileVersion(), dlFileShortcut,
587                            themeDisplay);
588            }
589    
590            public static String getThumbnailSrc(
591                            FileEntry fileEntry, FileVersion fileVersion,
592                            DLFileShortcut dlFileShortcut, ThemeDisplay themeDisplay)
593                    throws Exception {
594    
595                    StringBundler sb = new StringBundler(4);
596    
597                    sb.append(themeDisplay.getPathThemeImages());
598                    sb.append("/file_system/large/");
599                    sb.append(DLUtil.getGenericName(fileEntry.getExtension()));
600                    sb.append(".png");
601    
602                    String thumbnailSrc = sb.toString();
603    
604                    String thumbnailQueryString = null;
605    
606                    if (GetterUtil.getBoolean(
607                                    PropsUtil.get(PropsKeys.DL_FILE_ENTRY_THUMBNAIL_ENABLED))) {
608    
609                            if (ImageProcessorUtil.hasImages(fileVersion)) {
610                                    thumbnailQueryString = "&imageThumbnail=1";
611                            }
612                            else if (PDFProcessorUtil.hasImages(fileVersion)) {
613                                    thumbnailQueryString = "&documentThumbnail=1";
614                            }
615                            else if (VideoProcessorUtil.hasVideo(fileVersion)) {
616                                    thumbnailQueryString = "&videoThumbnail=1";
617                            }
618                    }
619    
620                    if (Validator.isNotNull(thumbnailQueryString)) {
621                            thumbnailSrc = getPreviewURL(
622                                    fileEntry, fileVersion, themeDisplay, thumbnailQueryString,
623                                    true, true);
624                    }
625    
626                    return thumbnailSrc;
627            }
628    
629            public static String getThumbnailStyle() throws Exception {
630                    return getThumbnailStyle(true, 0);
631            }
632    
633            public static String getThumbnailStyle(boolean max, int margin)
634                    throws Exception {
635    
636                    StringBundler sb = new StringBundler(5);
637    
638                    if (max) {
639                            sb.append("max-height: ");
640                    }
641                    else {
642                            sb.append("height: ");
643                    }
644    
645                    sb.append(
646                            PrefsPropsUtil.getLong(
647                                    PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_HEIGHT) + 2 * margin);
648    
649                    if (max) {
650                            sb.append("px; max-width: ");
651                    }
652                    else {
653                            sb.append("px; width: ");
654                    }
655    
656                    sb.append(
657                            PrefsPropsUtil.getLong(
658                                    PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_WIDTH) + 2 * margin);
659                    sb.append("px;");
660    
661                    return sb.toString();
662            }
663    
664            public static String getTitleWithExtension(FileEntry fileEntry) {
665                    String title = fileEntry.getTitle();
666                    String extension = fileEntry.getExtension();
667    
668                    return getTitleWithExtension(title, extension);
669            }
670    
671            public static String getTitleWithExtension(String title, String extension) {
672                    if (Validator.isNotNull(extension)) {
673                            String periodAndExtension = StringPool.PERIOD + extension;
674    
675                            if (!title.endsWith(periodAndExtension)) {
676                                    title += periodAndExtension;
677                            }
678                    }
679    
680                    return title;
681            }
682    
683            public static String getWebDavURL(
684                            ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry)
685                    throws PortalException, SystemException {
686    
687                    return getWebDavURL(themeDisplay, folder, fileEntry, false);
688            }
689    
690            public static String getWebDavURL(
691                            ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry,
692                            boolean manualCheckInRequired)
693                    throws PortalException, SystemException {
694    
695                    StringBuilder sb = new StringBuilder();
696    
697                    if (folder != null) {
698                            Folder curFolder = folder;
699    
700                            while (true) {
701                                    sb.insert(0, HttpUtil.encodeURL(curFolder.getName(), true));
702                                    sb.insert(0, StringPool.SLASH);
703    
704                                    if (curFolder.getParentFolderId() ==
705                                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
706    
707                                            break;
708                                    }
709                                    else {
710                                            curFolder = DLAppLocalServiceUtil.getFolder(
711                                                    curFolder.getParentFolderId());
712                                    }
713                            }
714                    }
715    
716                    if (fileEntry != null) {
717                            sb.append(StringPool.SLASH);
718                            sb.append(HttpUtil.encodeURL(fileEntry.getTitle(), true));
719                    }
720    
721                    Group group = themeDisplay.getScopeGroup();
722    
723                    StringBundler webDavURL = new StringBundler(7);
724    
725                    webDavURL.append(themeDisplay.getPortalURL());
726                    webDavURL.append(themeDisplay.getPathContext());
727                    webDavURL.append("/webdav");
728    
729                    if (manualCheckInRequired) {
730                            webDavURL.append(MANUAL_CHECK_IN_REQUIRED_PATH);
731                    }
732    
733                    webDavURL.append(group.getFriendlyURL());
734                    webDavURL.append("/document_library");
735                    webDavURL.append(sb.toString());
736    
737                    return webDavURL.toString();
738            }
739    
740            public static boolean hasWorkflowDefinitionLink(
741                            long companyId, long groupId, long folderId, long fileEntryTypeId)
742                    throws Exception {
743    
744                    while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
745                            DLFolder dlFolder = DLFolderLocalServiceUtil.fetchDLFolder(
746                                    folderId);
747    
748                            if (dlFolder == null) {
749                                    return false;
750                            }
751    
752                            if (dlFolder.isOverrideFileEntryTypes()) {
753                                    break;
754                            }
755    
756                            folderId = dlFolder.getParentFolderId();
757                    }
758    
759                    if (WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(
760                                    companyId, groupId, DLFolderConstants.getClassName(), folderId,
761                                    fileEntryTypeId) ||
762                            WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(
763                                    companyId, groupId, DLFolderConstants.getClassName(), folderId,
764                                    DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_ALL)) {
765    
766                            return true;
767                    }
768    
769                    return false;
770            }
771    
772            public static boolean isAutoGeneratedDLFileEntryTypeDDMStructureKey(
773                    String ddmStructureKey) {
774    
775                    if (ddmStructureKey.startsWith("auto_")) {
776                            return true;
777                    }
778    
779                    return false;
780            }
781    
782            private static long _getDefaultFolderId(HttpServletRequest request)
783                    throws Exception {
784    
785                    PortletPreferences portletPreferences =
786                            PortletPreferencesFactoryUtil.getPortletPreferences(
787                                    request, PortalUtil.getPortletId(request));
788    
789                    return GetterUtil.getLong(
790                            portletPreferences.getValue(
791                                    "rootFolderId",
792                                    String.valueOf(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)));
793            }
794    
795            private DLUtil() {
796                    _allMediaGalleryMimeTypes.addAll(
797                            SetUtil.fromArray(
798                                    PropsUtil.getArray(
799                                            PropsKeys.DL_FILE_ENTRY_PREVIEW_AUDIO_MIME_TYPES)));
800                    _allMediaGalleryMimeTypes.addAll(
801                            SetUtil.fromArray(
802                                    PropsUtil.getArray(
803                                            PropsKeys.DL_FILE_ENTRY_PREVIEW_VIDEO_MIME_TYPES)));
804                    _allMediaGalleryMimeTypes.addAll(
805                            SetUtil.fromArray(
806                                    PropsUtil.getArray(
807                                            PropsKeys.DL_FILE_ENTRY_PREVIEW_IMAGE_MIME_TYPES)));
808    
809                    _allMediaGalleryMimeTypesString = StringUtil.merge(
810                            _allMediaGalleryMimeTypes);
811    
812                    String[] fileIcons = null;
813    
814                    try {
815                            fileIcons = PrefsPropsUtil.getStringArray(
816                                    PropsKeys.DL_FILE_ICONS, StringPool.COMMA);
817                    }
818                    catch (Exception e) {
819                            _log.error(e, e);
820    
821                            fileIcons = new String[] {StringPool.BLANK};
822                    }
823    
824                    for (int i = 0; i < fileIcons.length; i++) {
825    
826                            // Only process non wildcard extensions
827    
828                            if (!StringPool.STAR.equals(fileIcons[i])) {
829    
830                                    // Strip starting period
831    
832                                    String extension = fileIcons[i];
833                                    extension = extension.substring(1);
834    
835                                    _fileIcons.add(extension);
836                            }
837                    }
838    
839                    String[] genericNames = PropsUtil.getArray(
840                            PropsKeys.DL_FILE_GENERIC_NAMES);
841    
842                    for (String genericName : genericNames) {
843                            _populateGenericNamesMap(genericName);
844                    }
845            }
846    
847            private String _getFileIcon(String extension) {
848                    if (!_fileIcons.contains(extension)) {
849                            extension = _DEFAULT_FILE_ICON;
850                    }
851    
852                    return extension;
853            }
854    
855            private String _getGenericName(String extension) {
856                    String genericName = _genericNames.get(extension);
857    
858                    if (genericName == null) {
859                            genericName = _DEFAULT_GENERIC_NAME;
860                    }
861    
862                    return genericName;
863            }
864    
865            private void _populateGenericNamesMap(String genericName) {
866                    String[] extensions = PropsUtil.getArray(
867                            PropsKeys.DL_FILE_GENERIC_EXTENSIONS, new Filter(genericName));
868    
869                    for (String extension : extensions) {
870                            _genericNames.put(extension, genericName);
871                    }
872            }
873    
874            private static final String _DEFAULT_FILE_ICON = "page";
875    
876            private static final String _DEFAULT_GENERIC_NAME = "default";
877    
878            private static final long _DIVISOR = 256;;
879    
880            private static Log _log = LogFactoryUtil.getLog(DLUtil.class);
881    
882            private static DLUtil _instance = new DLUtil();
883    
884            private Set<String> _allMediaGalleryMimeTypes = new TreeSet<String>();
885            private String _allMediaGalleryMimeTypesString;
886            private Set<String> _fileIcons = new HashSet<String>();
887            private Map<String, String> _genericNames = new HashMap<String, String>();
888    
889    }