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