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