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