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