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            /**
1014             * @deprecated As of 7.0.0, replaced by {@link #getThumbnailSrc(FileEntry,
1015             *             ThemeDisplay)}
1016             */
1017            @Deprecated
1018            @Override
1019            public String getThumbnailSrc(
1020                            FileEntry fileEntry, DLFileShortcut dlFileShortcut,
1021                            ThemeDisplay themeDisplay)
1022                    throws Exception {
1023    
1024                    return getThumbnailSrc(
1025                            fileEntry, fileEntry.getFileVersion(), themeDisplay);
1026            }
1027    
1028            /**
1029             * @deprecated As of 7.0.0, replaced by {@link #getThumbnailSrc(FileEntry,
1030             *             FileVersion, ThemeDisplay)}
1031             */
1032            @Deprecated
1033            @Override
1034            public String getThumbnailSrc(
1035                            FileEntry fileEntry, FileVersion fileVersion,
1036                            DLFileShortcut dlFileShortcut, ThemeDisplay themeDisplay)
1037                    throws Exception {
1038    
1039                    return getThumbnailSrc(fileEntry, fileVersion, themeDisplay);
1040            }
1041    
1042            @Override
1043            public String getThumbnailSrc(
1044                            FileEntry fileEntry, FileVersion fileVersion,
1045                            ThemeDisplay themeDisplay)
1046                    throws Exception {
1047    
1048                    String thumbnailQueryString = null;
1049    
1050                    if (PropsValues.DL_FILE_ENTRY_THUMBNAIL_ENABLED) {
1051                            if (ImageProcessorUtil.hasImages(fileVersion)) {
1052                                    thumbnailQueryString = "&imageThumbnail=1";
1053                            }
1054                            else if (PDFProcessorUtil.hasImages(fileVersion)) {
1055                                    thumbnailQueryString = "&documentThumbnail=1";
1056                            }
1057                            else if (VideoProcessorUtil.hasVideo(fileVersion)) {
1058                                    thumbnailQueryString = "&videoThumbnail=1";
1059                            }
1060                    }
1061    
1062                    return getImageSrc(
1063                            fileEntry, fileVersion, themeDisplay, thumbnailQueryString);
1064            }
1065    
1066            @Override
1067            public String getThumbnailSrc(
1068                            FileEntry fileEntry, ThemeDisplay themeDisplay)
1069                    throws Exception {
1070    
1071                    return getThumbnailSrc(
1072                            fileEntry, fileEntry.getFileVersion(), themeDisplay);
1073            }
1074    
1075            @Override
1076            public String getThumbnailStyle() throws Exception {
1077                    return getThumbnailStyle(true, 0);
1078            }
1079    
1080            @Override
1081            public String getThumbnailStyle(boolean max, int margin) throws Exception {
1082                    StringBundler sb = new StringBundler(5);
1083    
1084                    if (max) {
1085                            sb.append("max-height: ");
1086                    }
1087                    else {
1088                            sb.append("height: ");
1089                    }
1090    
1091                    sb.append(
1092                            PrefsPropsUtil.getLong(
1093                                    PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_HEIGHT) + 2 * margin);
1094    
1095                    if (max) {
1096                            sb.append("px; max-width: ");
1097                    }
1098                    else {
1099                            sb.append("px; width: ");
1100                    }
1101    
1102                    sb.append(
1103                            PrefsPropsUtil.getLong(
1104                                    PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_WIDTH) + 2 * margin);
1105                    sb.append("px;");
1106    
1107                    return sb.toString();
1108            }
1109    
1110            @Override
1111            public String getTitleWithExtension(FileEntry fileEntry) {
1112                    String title = fileEntry.getTitle();
1113                    String extension = fileEntry.getExtension();
1114    
1115                    return getTitleWithExtension(title, extension);
1116            }
1117    
1118            @Override
1119            public String getTitleWithExtension(String title, String extension) {
1120                    if (Validator.isNotNull(extension)) {
1121                            String periodAndExtension = StringPool.PERIOD.concat(extension);
1122    
1123                            if (!title.endsWith(periodAndExtension)) {
1124                                    title += periodAndExtension;
1125                            }
1126                    }
1127    
1128                    return title;
1129            }
1130    
1131            @Override
1132            public String getWebDavURL(
1133                            ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry)
1134                    throws PortalException {
1135    
1136                    return getWebDavURL(themeDisplay, folder, fileEntry, false);
1137            }
1138    
1139            @Override
1140            public String getWebDavURL(
1141                            ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry,
1142                            boolean manualCheckInRequired)
1143                    throws PortalException {
1144    
1145                    return getWebDavURL(
1146                            themeDisplay, folder, fileEntry, manualCheckInRequired, false);
1147            }
1148    
1149            @Override
1150            public String getWebDavURL(
1151                            ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry,
1152                            boolean manualCheckInRequired, boolean openDocumentUrl)
1153                    throws PortalException {
1154    
1155                    StringBundler webDavURL = new StringBundler(8);
1156    
1157                    boolean secure = false;
1158    
1159                    if (themeDisplay.isSecure() ||
1160                            PropsValues.WEBDAV_SERVLET_HTTPS_REQUIRED) {
1161    
1162                            secure = true;
1163                    }
1164    
1165                    String portalURL = PortalUtil.getPortalURL(
1166                            themeDisplay.getServerName(), themeDisplay.getServerPort(), secure);
1167    
1168                    webDavURL.append(portalURL);
1169    
1170                    webDavURL.append(themeDisplay.getPathContext());
1171                    webDavURL.append("/webdav");
1172    
1173                    if (manualCheckInRequired) {
1174                            webDavURL.append(MANUAL_CHECK_IN_REQUIRED_PATH);
1175                    }
1176    
1177                    String fileEntryFileName = null;
1178    
1179                    Group group = null;
1180    
1181                    if (fileEntry != null) {
1182                            fileEntryFileName = HtmlUtil.unescape(fileEntry.getFileName());
1183    
1184                            group = GroupLocalServiceUtil.getGroup(fileEntry.getGroupId());
1185                    }
1186                    else {
1187                            group = themeDisplay.getScopeGroup();
1188                    }
1189    
1190                    webDavURL.append(group.getFriendlyURL());
1191                    webDavURL.append("/document_library");
1192    
1193                    StringBuilder sb = new StringBuilder();
1194    
1195                    if ((folder != null) &&
1196                            (folder.getFolderId() !=
1197                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)) {
1198    
1199                            Folder curFolder = folder;
1200    
1201                            while (true) {
1202                                    sb.insert(0, HttpUtil.encodeURL(curFolder.getName(), true));
1203                                    sb.insert(0, StringPool.SLASH);
1204    
1205                                    if (curFolder.getParentFolderId() ==
1206                                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
1207    
1208                                            break;
1209                                    }
1210    
1211                                    curFolder = DLAppLocalServiceUtil.getFolder(
1212                                            curFolder.getParentFolderId());
1213                            }
1214                    }
1215    
1216                    if (fileEntry != null) {
1217                            sb.append(StringPool.SLASH);
1218                            sb.append(HttpUtil.encodeURL(fileEntryFileName, true));
1219                    }
1220    
1221                    webDavURL.append(sb.toString());
1222    
1223                    return webDavURL.toString();
1224            }
1225    
1226            @Override
1227            public boolean hasWorkflowDefinitionLink(
1228                            long companyId, long groupId, long folderId, long fileEntryTypeId)
1229                    throws Exception {
1230    
1231                    while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
1232                            DLFolder dlFolder = DLFolderLocalServiceUtil.fetchDLFolder(
1233                                    folderId);
1234    
1235                            if (dlFolder == null) {
1236                                    return false;
1237                            }
1238    
1239                            if (dlFolder.getRestrictionType() !=
1240                                            DLFolderConstants.RESTRICTION_TYPE_INHERIT) {
1241    
1242                                    break;
1243                            }
1244    
1245                            folderId = dlFolder.getParentFolderId();
1246                    }
1247    
1248                    if (WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(
1249                                    companyId, groupId, DLFolderConstants.getClassName(), folderId,
1250                                    fileEntryTypeId) ||
1251                            WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(
1252                                    companyId, groupId, DLFolderConstants.getClassName(), folderId,
1253                                    DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_ALL)) {
1254    
1255                            return true;
1256                    }
1257    
1258                    return false;
1259            }
1260    
1261            @Override
1262            public boolean isAutoGeneratedDLFileEntryTypeDDMStructureKey(
1263                    String ddmStructureKey) {
1264    
1265                    if (ddmStructureKey.startsWith(_STRUCTURE_KEY_PREFIX)) {
1266                            return true;
1267                    }
1268    
1269                    return false;
1270            }
1271    
1272            @Override
1273            public boolean isOfficeExtension(String extension) {
1274                    return ArrayUtil.contains(_MICROSOFT_OFFICE_EXTENSIONS, extension);
1275            }
1276    
1277            @Override
1278            public boolean isSubscribedToFileEntryType(
1279                    long companyId, long groupId, long userId, long fileEntryTypeId) {
1280    
1281                    if (fileEntryTypeId ==
1282                                    DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) {
1283    
1284                            fileEntryTypeId = groupId;
1285                    }
1286    
1287                    return SubscriptionLocalServiceUtil.isSubscribed(
1288                            companyId, userId, DLFileEntryType.class.getName(),
1289                            fileEntryTypeId);
1290            }
1291    
1292            @Override
1293            public boolean isSubscribedToFolder(
1294                            long companyId, long groupId, long userId, long folderId)
1295                    throws PortalException {
1296    
1297                    return isSubscribedToFolder(companyId, groupId, userId, folderId, true);
1298            }
1299    
1300            @Override
1301            public boolean isSubscribedToFolder(
1302                            long companyId, long groupId, long userId, long folderId,
1303                            boolean recursive)
1304                    throws PortalException {
1305    
1306                    List<Long> ancestorFolderIds = new ArrayList<Long>();
1307    
1308                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
1309                            Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
1310    
1311                            ancestorFolderIds.add(folderId);
1312    
1313                            if (recursive) {
1314                                    ancestorFolderIds.addAll(folder.getAncestorFolderIds());
1315    
1316                                    ancestorFolderIds.add(groupId);
1317                            }
1318                    }
1319                    else {
1320                            ancestorFolderIds.add(groupId);
1321                    }
1322    
1323                    long[] folderIdsArray = ArrayUtil.toLongArray(ancestorFolderIds);
1324    
1325                    return SubscriptionLocalServiceUtil.isSubscribed(
1326                            companyId, userId, DLFolder.class.getName(), folderIdsArray);
1327            }
1328    
1329            @Override
1330            public boolean isValidVersion(String version) {
1331                    if (version.equals(DLFileEntryConstants.PRIVATE_WORKING_COPY_VERSION)) {
1332                            return true;
1333                    }
1334    
1335                    String[] versionParts = StringUtil.split(version, StringPool.PERIOD);
1336    
1337                    if (versionParts.length != 2) {
1338                            return false;
1339                    }
1340    
1341                    if (Validator.isNumber(versionParts[0]) &&
1342                            Validator.isNumber(versionParts[1])) {
1343    
1344                            return true;
1345                    }
1346    
1347                    return false;
1348            }
1349    
1350            @Override
1351            public void startWorkflowInstance(
1352                            long userId, DLFileVersion dlFileVersion, String syncEventType,
1353                            ServiceContext serviceContext)
1354                    throws PortalException {
1355    
1356                    Map<String, Serializable> workflowContext =
1357                            new HashMap<String, Serializable>();
1358    
1359                    workflowContext.put(
1360                            WorkflowConstants.CONTEXT_URL,
1361                            getEntryURL(dlFileVersion, serviceContext));
1362                    workflowContext.put("event", syncEventType);
1363    
1364                    WorkflowHandlerRegistryUtil.startWorkflowInstance(
1365                            dlFileVersion.getCompanyId(), dlFileVersion.getGroupId(), userId,
1366                            DLFileEntryConstants.getClassName(),
1367                            dlFileVersion.getFileVersionId(), dlFileVersion, serviceContext,
1368                            workflowContext);
1369            }
1370    
1371            protected String getEntryURL(
1372                            DLFileVersion dlFileVersion, ServiceContext serviceContext)
1373                    throws PortalException {
1374    
1375                    HttpServletRequest request = serviceContext.getRequest();
1376    
1377                    if ((request == null) || (serviceContext.getThemeDisplay() == null)) {
1378                            return StringPool.BLANK;
1379                    }
1380    
1381                    long plid = serviceContext.getPlid();
1382    
1383                    long controlPanelPlid = PortalUtil.getControlPanelPlid(
1384                            serviceContext.getCompanyId());
1385    
1386                    if (plid == controlPanelPlid) {
1387                            plid = PortalUtil.getPlidFromPortletId(
1388                                    dlFileVersion.getGroupId(), PortletKeys.DOCUMENT_LIBRARY);
1389                    }
1390    
1391                    if (plid == LayoutConstants.DEFAULT_PLID) {
1392                            plid = controlPanelPlid;
1393                    }
1394    
1395                    PortletURL portletURL = PortletURLFactoryUtil.create(
1396                            request, PortletKeys.DOCUMENT_LIBRARY, plid,
1397                            PortletRequest.RENDER_PHASE);
1398    
1399                    portletURL.setParameter(
1400                            "struts_action", "/document_library/view_file_entry");
1401                    portletURL.setParameter(
1402                            "fileEntryId", String.valueOf(dlFileVersion.getFileEntryId()));
1403    
1404                    return portletURL.toString();
1405            }
1406    
1407            protected String getImageSrc(
1408                            FileEntry fileEntry, FileVersion fileVersion,
1409                            ThemeDisplay themeDisplay, String queryString)
1410                    throws Exception {
1411    
1412                    StringBundler sb = new StringBundler(4);
1413    
1414                    sb.append(themeDisplay.getPathThemeImages());
1415                    sb.append("/file_system/large/");
1416                    sb.append(getGenericName(fileEntry.getExtension()));
1417                    sb.append(".png");
1418    
1419                    String thumbnailSrc = sb.toString();
1420    
1421                    if (Validator.isNotNull(queryString)) {
1422                            thumbnailSrc = getPreviewURL(
1423                                    fileEntry, fileVersion, themeDisplay, queryString, true, true);
1424                    }
1425    
1426                    return thumbnailSrc;
1427            }
1428    
1429            private static void _populateGenericNamesMap(String genericName) {
1430                    String[] extensions = PropsUtil.getArray(
1431                            PropsKeys.DL_FILE_GENERIC_EXTENSIONS, new Filter(genericName));
1432    
1433                    for (String extension : extensions) {
1434                            _genericNames.put(extension, genericName);
1435                    }
1436            }
1437    
1438            private static final String _DEFAULT_FILE_ICON = "page";
1439    
1440            private static final String _DEFAULT_GENERIC_NAME = "default";
1441    
1442            private static final long _DIVISOR = 256;
1443    
1444            private static final String[] _MICROSOFT_OFFICE_EXTENSIONS = {
1445                    "accda", "accdb", "accdc", "accde", "accdp", "accdr", "accdt", "accdu",
1446                    "acl", "ade", "adp", "asd", "cnv", "crtx", "doc", "docm", "docx", "dot",
1447                    "dotm", "dotx", "grv", "iaf", "laccdb", "maf", "mam", "maq", "mar",
1448                    "mat", "mda", "mdb", "mde", "mdt", "mdw", "mpd", "mpp", "mpt", "oab",
1449                    "obi", "oft", "olm", "one", "onepkg", "ops", "ost", "pa", "pip", "pot",
1450                    "potm", "potx", "ppa", "ppam", "pps", "ppsm", "ppsx", "ppt", "pptm",
1451                    "pptx", "prf", "pst", "pub", "puz", "rpmsg", "sldm", "sldx", "slk",
1452                    "snp", "svd", "thmx", "vdx", "vrge08message", "vsd", "vss", "vst",
1453                    "vsx", "vtx", "wbk", "wll", "xar", "xl", "xla", "xlam", "xlb", "xlc",
1454                    "xll", "xlm", "xls", "xlsb", "xlsm", "xlsx", "xlt", "xltm", "xltx",
1455                    "xlw", "xsf", "xsn"
1456            };
1457    
1458            private static final String _STRUCTURE_KEY_PREFIX = "AUTO_";
1459    
1460            private static Log _log = LogFactoryUtil.getLog(DLImpl.class);
1461    
1462            private static Set<String> _allMediaGalleryMimeTypes =
1463                    new TreeSet<String>();
1464            private static Set<String> _fileIcons = new HashSet<String>();
1465            private static Map<String, String> _genericNames =
1466                    new HashMap<String, String>();
1467    
1468            static {
1469                    _allMediaGalleryMimeTypes.addAll(
1470                            SetUtil.fromArray(
1471                                    PropsUtil.getArray(
1472                                            PropsKeys.DL_FILE_ENTRY_PREVIEW_AUDIO_MIME_TYPES)));
1473                    _allMediaGalleryMimeTypes.addAll(
1474                            SetUtil.fromArray(
1475                                    PropsUtil.getArray(
1476                                            PropsKeys.DL_FILE_ENTRY_PREVIEW_VIDEO_MIME_TYPES)));
1477                    _allMediaGalleryMimeTypes.addAll(
1478                            SetUtil.fromArray(
1479                                    PropsUtil.getArray(
1480                                            PropsKeys.DL_FILE_ENTRY_PREVIEW_IMAGE_MIME_TYPES)));
1481    
1482                    String[] fileIcons = null;
1483    
1484                    try {
1485                            fileIcons = PropsUtil.getArray(PropsKeys.DL_FILE_ICONS);
1486                    }
1487                    catch (Exception e) {
1488                            if (_log.isDebugEnabled()) {
1489                                    _log.debug(e, e);
1490                            }
1491    
1492                            fileIcons = new String[] {StringPool.BLANK};
1493                    }
1494    
1495                    for (int i = 0; i < fileIcons.length; i++) {
1496    
1497                            // Only process non wildcard extensions
1498    
1499                            if (!StringPool.STAR.equals(fileIcons[i])) {
1500    
1501                                    // Strip starting period
1502    
1503                                    String extension = fileIcons[i];
1504    
1505                                    if (extension.length() > 0) {
1506                                            extension = extension.substring(1);
1507                                    }
1508    
1509                                    _fileIcons.add(extension);
1510                            }
1511                    }
1512    
1513                    String[] genericNames = PropsUtil.getArray(
1514                            PropsKeys.DL_FILE_GENERIC_NAMES);
1515    
1516                    for (String genericName : genericNames) {
1517                            _populateGenericNamesMap(genericName);
1518                    }
1519            }
1520    
1521    }