Java tutorial
/* ./liferay-liferay-portal-b66e4b4/portal-impl/src/com/liferay/portlet/documentlibrary/util/DLImpl.java */ /** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portlet.documentlibrary.util; import com.liferay.portal.kernel.configuration.Filter; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.portlet.LiferayPortletResponse; import com.liferay.portal.kernel.portlet.LiferayWindowState; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.repository.model.FileVersion; import com.liferay.portal.kernel.repository.model.Folder; import com.liferay.portal.kernel.search.Document; import com.liferay.portal.kernel.search.Field; import com.liferay.portal.kernel.search.Hits; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.FileUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.HttpUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.PrefsPropsUtil; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil; import com.liferay.portal.model.Company; import com.liferay.portal.model.Group; import com.liferay.portal.model.LayoutConstants; import com.liferay.portal.model.Subscription; import com.liferay.portal.service.GroupLocalServiceUtil; import com.liferay.portal.service.ServiceContext; import com.liferay.portal.service.SubscriptionLocalServiceUtil; import com.liferay.portal.service.WorkflowDefinitionLinkLocalServiceUtil; import com.liferay.portal.theme.PortletDisplay; import com.liferay.portal.theme.ThemeDisplay; import com.liferay.portal.util.PortalUtil; import com.liferay.portal.util.PortletKeys; import com.liferay.portal.util.PropsValues; import com.liferay.portlet.PortletURLFactoryUtil; import com.liferay.portlet.documentlibrary.DLPortletInstanceSettings; import com.liferay.portlet.documentlibrary.action.EditFileEntryAction; import com.liferay.portlet.documentlibrary.model.DLFileEntry; import com.liferay.portlet.documentlibrary.model.DLFileEntryConstants; import com.liferay.portlet.documentlibrary.model.DLFileEntryType; import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants; import com.liferay.portlet.documentlibrary.model.DLFileShortcut; import com.liferay.portlet.documentlibrary.model.DLFileVersion; import com.liferay.portlet.documentlibrary.model.DLFolder; import com.liferay.portlet.documentlibrary.model.DLFolderConstants; import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil; import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelCreateDateComparator; import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelModifiedDateComparator; import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelNameComparator; import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelReadCountComparator; import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelSizeComparator; import com.liferay.portlet.messageboards.model.MBMessage; import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil; import com.liferay.portlet.trash.util.TrashUtil; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import javax.portlet.PortletRequest; import javax.portlet.PortletURL; import javax.portlet.RenderResponse; import javax.servlet.http.HttpServletRequest; /** * @author Brian Wing Shun Chan * @author Julio Camarero */ public class DLImpl implements DL { @Override public void addPortletBreadcrumbEntries(DLFileShortcut dlFileShortcut, HttpServletRequest request, RenderResponse renderResponse) throws Exception { Folder folder = dlFileShortcut.getFolder(); if (folder.getFolderId() != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { addPortletBreadcrumbEntries(folder, request, renderResponse); } DLFileShortcut unescapedDLFileShortcut = dlFileShortcut.toUnescapedModel(); PortletURL portletURL = renderResponse.createRenderURL(); portletURL.setParameter("struts_action", "/document_library/view_file_entry"); portletURL.setParameter("fileEntryId", String.valueOf(dlFileShortcut.getToFileEntryId())); PortalUtil.addPortletBreadcrumbEntry(request, unescapedDLFileShortcut.getToTitle(), portletURL.toString()); } @Override public void addPortletBreadcrumbEntries(FileEntry fileEntry, HttpServletRequest request, RenderResponse renderResponse) throws Exception { Folder folder = fileEntry.getFolder(); if (folder.getFolderId() != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { addPortletBreadcrumbEntries(folder, request, renderResponse); } PortletURL portletURL = renderResponse.createRenderURL(); FileEntry unescapedFileEntry = fileEntry.toUnescapedModel(); portletURL.setParameter("struts_action", "/document_library/view_file_entry"); portletURL.setParameter("fileEntryId", String.valueOf(fileEntry.getFileEntryId())); PortalUtil.addPortletBreadcrumbEntry(request, unescapedFileEntry.getTitle(), portletURL.toString()); } @Override public void addPortletBreadcrumbEntries(Folder folder, HttpServletRequest request, LiferayPortletResponse liferayPortletResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); PortletURL portletURL = liferayPortletResponse.createRenderURL(); portletURL.setParameter("struts_action", "/document_library/view"); Map<String, Object> data = new HashMap<>(); data.put("direction-right", Boolean.TRUE.toString()); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); DLPortletInstanceSettings dlPortletInstanceSettings = DLPortletInstanceSettings .getInstance(themeDisplay.getLayout(), portletDisplay.getId()); data.put("folder-id", dlPortletInstanceSettings.getDefaultFolderId()); PortalUtil.addPortletBreadcrumbEntry(request, themeDisplay.translate("home"), portletURL.toString(), data); addPortletBreadcrumbEntries(folder, request, portletURL); } @Override public void addPortletBreadcrumbEntries(Folder folder, HttpServletRequest request, PortletURL portletURL) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); long defaultFolderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID; boolean ignoreRootFolder = ParamUtil.getBoolean(request, "ignoreRootFolder"); if (!ignoreRootFolder) { DLPortletInstanceSettings dlPortletInstanceSettings = DLPortletInstanceSettings .getInstance(themeDisplay.getLayout(), portletDisplay.getId()); defaultFolderId = dlPortletInstanceSettings.getDefaultFolderId(); } List<Folder> ancestorFolders = Collections.emptyList(); if ((folder != null) && (folder.getFolderId() != defaultFolderId)) { ancestorFolders = folder.getAncestors(); int indexOfRootFolder = -1; for (int i = 0; i < ancestorFolders.size(); i++) { Folder ancestorFolder = ancestorFolders.get(i); if (defaultFolderId == ancestorFolder.getFolderId()) { indexOfRootFolder = i; } } if (indexOfRootFolder > -1) { ancestorFolders = ancestorFolders.subList(0, indexOfRootFolder); } } Collections.reverse(ancestorFolders); for (Folder ancestorFolder : ancestorFolders) { portletURL.setParameter("folderId", String.valueOf(ancestorFolder.getFolderId())); Map<String, Object> data = new HashMap<>(); data.put("direction-right", Boolean.TRUE.toString()); data.put("folder-id", ancestorFolder.getFolderId()); PortalUtil.addPortletBreadcrumbEntry(request, ancestorFolder.getName(), portletURL.toString(), data); } long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID; if (folder != null) { folderId = folder.getFolderId(); } portletURL.setParameter("folderId", String.valueOf(folderId)); if ((folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) && (folderId != defaultFolderId)) { Folder unescapedFolder = folder.toUnescapedModel(); Map<String, Object> data = new HashMap<>(); data.put("direction-right", Boolean.TRUE.toString()); data.put("folder-id", folderId); PortalUtil.addPortletBreadcrumbEntry(request, unescapedFolder.getName(), portletURL.toString(), data); } } @Override public void addPortletBreadcrumbEntries(Folder folder, HttpServletRequest request, RenderResponse renderResponse) throws Exception { String strutsAction = ParamUtil.getString(request, "struts_action"); long groupId = ParamUtil.getLong(request, "groupId"); boolean ignoreRootFolder = ParamUtil.getBoolean(request, "ignoreRootFolder"); PortletURL portletURL = renderResponse.createRenderURL(); if (strutsAction.equals("/document_library/select_file_entry") || strutsAction.equals("/document_library/select_folder") || strutsAction.equals("/document_library_display/select_folder") || strutsAction.equals("/image_gallery_display/select_folder") || strutsAction.equals("/item_selector/view")) { ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); portletURL.setParameter("struts_action", strutsAction); portletURL.setParameter("groupId", String.valueOf(groupId)); portletURL.setParameter("ignoreRootFolder", String.valueOf(ignoreRootFolder)); portletURL.setWindowState(LiferayWindowState.POP_UP); PortalUtil.addPortletBreadcrumbEntry(request, themeDisplay.translate("home"), portletURL.toString()); } else { portletURL.setParameter("struts_action", "/document_library/view"); } addPortletBreadcrumbEntries(folder, request, portletURL); } @Override public void addPortletBreadcrumbEntries(long folderId, HttpServletRequest request, RenderResponse renderResponse) throws Exception { if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { Folder folder = DLAppLocalServiceUtil.getFolder(folderId); if (folder.getFolderId() != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { addPortletBreadcrumbEntries(folder, request, renderResponse); } } } @Override public int compareVersions(String version1, String version2) { int[] splitVersion1 = StringUtil.split(version1, StringPool.PERIOD, 0); int[] splitVersion2 = StringUtil.split(version2, StringPool.PERIOD, 0); if ((splitVersion1.length != 2) && (splitVersion2.length != 2)) { return 0; } else if (splitVersion1.length != 2) { return -1; } else if (splitVersion2.length != 2) { return 1; } if (splitVersion1[0] > splitVersion2[0]) { return 1; } else if (splitVersion1[0] < splitVersion2[0]) { return -1; } else if (splitVersion1[1] > splitVersion2[1]) { return 1; } else if (splitVersion1[1] < splitVersion2[1]) { return -1; } return 0; } @Override public String getAbsolutePath(PortletRequest portletRequest, long folderId) throws PortalException { ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); if (folderId == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { return themeDisplay.translate("home"); } Folder folder = DLAppLocalServiceUtil.getFolder(folderId); List<Folder> folders = folder.getAncestors(); Collections.reverse(folders); StringBundler sb = new StringBundler((folders.size() * 3) + 5); sb.append(themeDisplay.translate("home")); sb.append(StringPool.SPACE); for (Folder curFolder : folders) { sb.append(StringPool.RAQUO_CHAR); sb.append(StringPool.SPACE); sb.append(curFolder.getName()); } sb.append(StringPool.RAQUO_CHAR); sb.append(StringPool.SPACE); sb.append(folder.getName()); return sb.toString(); } @Override public Set<String> getAllMediaGalleryMimeTypes() { return _allMediaGalleryMimeTypes; } @Override public String getDDMStructureKey(DLFileEntryType dlFileEntryType) { return getDDMStructureKey(dlFileEntryType.getUuid()); } @Override public String getDDMStructureKey(String fileEntryTypeUuid) { return _STRUCTURE_KEY_PREFIX + StringUtil.toUpperCase(fileEntryTypeUuid); } @Override public String getDeprecatedDDMStructureKey(DLFileEntryType dlFileEntryType) { return getDeprecatedDDMStructureKey(dlFileEntryType.getFileEntryTypeId()); } @Override public String getDeprecatedDDMStructureKey(long fileEntryTypeId) { return _STRUCTURE_KEY_PREFIX + fileEntryTypeId; } @Override public String getDividedPath(long id) { StringBundler sb = new StringBundler(16); long dividend = id; while ((dividend / _DIVISOR) != 0) { sb.append(StringPool.SLASH); sb.append(dividend % _DIVISOR); dividend = dividend / _DIVISOR; } sb.append(StringPool.SLASH); sb.append(id); return sb.toString(); } @Override public String getDLFileEntryControlPanelLink(PortletRequest portletRequest, long fileEntryId) throws PortalException { ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); PortletURL portletURL = PortletURLFactoryUtil.create(portletRequest, PortletKeys.DOCUMENT_LIBRARY_ADMIN, PortalUtil.getControlPanelPlid(themeDisplay.getCompanyId()), PortletRequest.RENDER_PHASE); portletURL.setParameter("struts_action", "/document_library/view_file_entry"); portletURL.setParameter("fileEntryId", String.valueOf(fileEntryId)); return portletURL.toString(); } @Override public String getDLFolderControlPanelLink(PortletRequest portletRequest, long folderId) throws PortalException { ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); PortletURL portletURL = PortletURLFactoryUtil.create(portletRequest, PortletKeys.DOCUMENT_LIBRARY_ADMIN, PortalUtil.getControlPanelPlid(themeDisplay.getCompanyId()), PortletRequest.RENDER_PHASE); portletURL.setParameter("struts_action", "/document_library/view"); portletURL.setParameter("folderId", String.valueOf(folderId)); return portletURL.toString(); } @Override public String getDownloadURL(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay, String queryString) { return getDownloadURL(fileEntry, fileVersion, themeDisplay, queryString, true, true); } @Override public String getDownloadURL(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay, String queryString, boolean appendVersion, boolean absoluteURL) { String previewURL = getPreviewURL(fileEntry, fileVersion, themeDisplay, queryString, appendVersion, absoluteURL); return HttpUtil.addParameter(previewURL, "download", true); } @Override public Map<String, String> getEmailDefinitionTerms(PortletRequest portletRequest, String emailFromAddress, String emailFromName) { ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); Map<String, String> definitionTerms = new LinkedHashMap<>(); definitionTerms.put("[$COMPANY_ID$]", LanguageUtil.get(themeDisplay.getLocale(), "the-company-id-associated-with-the-document")); definitionTerms.put("[$COMPANY_MX$]", LanguageUtil.get(themeDisplay.getLocale(), "the-company-mx-associated-with-the-document")); definitionTerms.put("[$COMPANY_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-company-name-associated-with-the-document")); definitionTerms.put("[$DOCUMENT_TITLE$]", LanguageUtil.get(themeDisplay.getLocale(), "the-document-title")); definitionTerms.put("[$DOCUMENT_TYPE$]", LanguageUtil.get(themeDisplay.getLocale(), "the-document-type")); definitionTerms.put("[$DOCUMENT_URL$]", LanguageUtil.get(themeDisplay.getLocale(), "the-document-url")); definitionTerms.put("[$DOCUMENT_USER_ADDRESS$]", LanguageUtil.get(themeDisplay.getLocale(), "the-email-address-of-the-user-who-added-the-document")); definitionTerms.put("[$DOCUMENT_USER_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-user-who-added-the-document")); definitionTerms.put("[$FOLDER_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-folder-in-which-the-document-has-been-added")); definitionTerms.put("[$FROM_ADDRESS$]", HtmlUtil.escape(emailFromAddress)); definitionTerms.put("[$FROM_NAME$]", HtmlUtil.escape(emailFromName)); Company company = themeDisplay.getCompany(); definitionTerms.put("[$PORTAL_URL$]", company.getVirtualHostname()); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); definitionTerms.put("[$PORTLET_NAME$]", HtmlUtil.escape(portletDisplay.getTitle())); definitionTerms.put("[$SITE_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-site-name-associated-with-the-document")); definitionTerms.put("[$TO_ADDRESS$]", LanguageUtil.get(themeDisplay.getLocale(), "the-address-of-the-email-recipient")); definitionTerms.put("[$TO_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-name-of-the-email-recipient")); return definitionTerms; } @Override public Map<String, String> getEmailFromDefinitionTerms(PortletRequest portletRequest, String emailFromAddress, String emailFromName) { ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY); Map<String, String> definitionTerms = new LinkedHashMap<>(); definitionTerms.put("[$COMPANY_ID$]", LanguageUtil.get(themeDisplay.getLocale(), "the-company-id-associated-with-the-document")); definitionTerms.put("[$COMPANY_MX$]", LanguageUtil.get(themeDisplay.getLocale(), "the-company-mx-associated-with-the-document")); definitionTerms.put("[$COMPANY_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-company-name-associated-with-the-document")); definitionTerms.put("[$DOCUMENT_STATUS_BY_USER_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-user-who-updated-the-document")); definitionTerms.put("[$DOCUMENT_USER_ADDRESS$]", LanguageUtil.get(themeDisplay.getLocale(), "the-email-address-of-the-user-who-added-the-document")); definitionTerms.put("[$DOCUMENT_USER_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-user-who-added-the-document")); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); definitionTerms.put("[$PORTLET_NAME$]", HtmlUtil.escape(portletDisplay.getTitle())); definitionTerms.put("[$SITE_NAME$]", LanguageUtil.get(themeDisplay.getLocale(), "the-site-name-associated-with-the-document")); return definitionTerms; } @Override public List<Object> getEntries(Hits hits) { List<Object> entries = new ArrayList<>(); for (Document document : hits.getDocs()) { String entryClassName = GetterUtil.getString(document.get(Field.ENTRY_CLASS_NAME)); long entryClassPK = GetterUtil.getLong(document.get(Field.ENTRY_CLASS_PK)); try { Object obj = null; if (entryClassName.equals(DLFileEntry.class.getName())) { obj = DLAppLocalServiceUtil.getFileEntry(entryClassPK); } else if (entryClassName.equals(MBMessage.class.getName())) { long classPK = GetterUtil.getLong(document.get(Field.CLASS_PK)); DLAppLocalServiceUtil.getFileEntry(classPK); obj = MBMessageLocalServiceUtil.getMessage(entryClassPK); } entries.add(obj); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn("Documents and Media search index is stale and " + "contains entry {className=" + entryClassName + ", classPK=" + entryClassPK + "}"); } } } return entries; } @Override public List<FileEntry> getFileEntries(Hits hits) { List<FileEntry> entries = new ArrayList<>(); for (Document document : hits.getDocs()) { long fileEntryId = GetterUtil.getLong(document.get(Field.ENTRY_CLASS_PK)); try { FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId); entries.add(fileEntry); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn("Documents and Media search index is stale and " + "contains file entry " + fileEntryId); } } } return entries; } @Override public String getFileEntryImage(FileEntry fileEntry, ThemeDisplay themeDisplay) { StringBundler sb = new StringBundler(5); sb.append("<img src=\""); sb.append(themeDisplay.getPathThemeImages()); sb.append("/file_system/small/"); sb.append(fileEntry.getIcon()); sb.append(".png\" style=\"border-width: 0; text-align: left;\">"); return sb.toString(); } @Override public Set<Long> getFileEntryTypeSubscriptionClassPKs(long userId) { List<Subscription> subscriptions = SubscriptionLocalServiceUtil.getUserSubscriptions(userId, DLFileEntryType.class.getName()); Set<Long> classPKs = new HashSet<>(subscriptions.size()); for (Subscription subscription : subscriptions) { classPKs.add(subscription.getClassPK()); } return classPKs; } @Override public String getFileIcon(String extension) { if (!_fileIcons.contains(extension)) { extension = _DEFAULT_FILE_ICON; } return extension; } @Override public String getFileIconCssClass(String extension) { return "icon-file-alt"; } @Override public String getFileName(long groupId, long folderId, String tempFileName) { String extension = FileUtil.getExtension(tempFileName); int pos = tempFileName.lastIndexOf(EditFileEntryAction.TEMP_RANDOM_SUFFIX); if (pos != -1) { tempFileName = tempFileName.substring(0, pos); if (Validator.isNotNull(extension)) { tempFileName = tempFileName + StringPool.PERIOD + extension; } } while (true) { try { DLAppLocalServiceUtil.getFileEntry(groupId, folderId, tempFileName); StringBundler sb = new StringBundler(5); sb.append(FileUtil.stripExtension(tempFileName)); sb.append(StringPool.DASH); sb.append(StringUtil.randomString()); if (Validator.isNotNull(extension)) { sb.append(StringPool.PERIOD); sb.append(extension); } tempFileName = sb.toString(); } catch (Exception e) { break; } } return tempFileName; } @Override public String getGenericName(String extension) { String genericName = _genericNames.get(extension); if (genericName == null) { genericName = _DEFAULT_GENERIC_NAME; } return genericName; } @Override public String getImagePreviewURL(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay) throws Exception { String previewQueryString = null; if (PropsValues.DL_FILE_ENTRY_THUMBNAIL_ENABLED) { if (ImageProcessorUtil.hasImages(fileVersion)) { previewQueryString = "&imagePreview=1"; } else if (PDFProcessorUtil.hasImages(fileVersion)) { previewQueryString = "&previewFileIndex=1"; } else if (VideoProcessorUtil.hasVideo(fileVersion)) { previewQueryString = "&videoThumbnail=1"; } } return getImageSrc(fileEntry, fileVersion, themeDisplay, previewQueryString); } @Override public String getImagePreviewURL(FileEntry fileEntry, ThemeDisplay themeDisplay) throws Exception { return getImagePreviewURL(fileEntry, fileEntry.getFileVersion(), themeDisplay); } @Override public String getPreviewURL(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay, String queryString) { return getPreviewURL(fileEntry, fileVersion, themeDisplay, queryString, true, true); } /** * @deprecated As of 6.2.0, replaced by {@link #getPreviewURL(FileEntry, * FileVersion, ThemeDisplay, String, boolean, boolean)} */ @Deprecated @Override public String getPreviewURL(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay, String queryString, boolean appendToken) { return getPreviewURL(fileEntry, fileVersion, themeDisplay, queryString, true, true); } @Override public String getPreviewURL(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay, String queryString, boolean appendVersion, boolean absoluteURL) { StringBundler sb = new StringBundler(17); if (themeDisplay != null) { if (absoluteURL) { sb.append(themeDisplay.getPortalURL()); } } sb.append(PortalUtil.getPathContext()); sb.append("/documents/"); sb.append(fileEntry.getRepositoryId()); sb.append(StringPool.SLASH); sb.append(fileEntry.getFolderId()); sb.append(StringPool.SLASH); String fileName = fileEntry.getFileName(); if (fileEntry.isInTrash()) { fileName = TrashUtil.getOriginalTitle(fileEntry.getFileName()); } sb.append(HttpUtil.encodeURL(HtmlUtil.unescape(fileName))); sb.append(StringPool.SLASH); sb.append(HttpUtil.encodeURL(fileEntry.getUuid())); if (appendVersion) { sb.append("?version="); sb.append(fileVersion.getVersion()); } if (ImageProcessorUtil.isImageSupported(fileVersion)) { if (appendVersion) { sb.append("&t="); } else { sb.append("?t="); } Date modifiedDate = fileVersion.getModifiedDate(); sb.append(modifiedDate.getTime()); } sb.append(queryString); String previewURL = sb.toString(); if ((themeDisplay != null) && themeDisplay.isAddSessionIdToURL()) { return PortalUtil.getURLWithSessionId(previewURL, themeDisplay.getSessionId()); } return previewURL; } @Override public <T> OrderByComparator<T> getRepositoryModelOrderByComparator(String orderByCol, String orderByType) { boolean orderByAsc = true; if (orderByType.equals("desc")) { orderByAsc = false; } OrderByComparator<T> orderByComparator = null; if (orderByCol.equals("creationDate")) { orderByComparator = new RepositoryModelCreateDateComparator<>(orderByAsc); } else if (orderByCol.equals("downloads")) { orderByComparator = new RepositoryModelReadCountComparator<>(orderByAsc); } else if (orderByCol.equals("modifiedDate")) { orderByComparator = new RepositoryModelModifiedDateComparator<>(orderByAsc); } else if (orderByCol.equals("size")) { orderByComparator = new RepositoryModelSizeComparator<>(orderByAsc); } else { orderByComparator = new RepositoryModelNameComparator<>(orderByAsc); } return orderByComparator; } @Override public String getSanitizedFileName(String title, String extension) { String fileName = StringUtil.replace(title, StringPool.SLASH, StringPool.UNDERLINE); if (Validator.isNotNull(extension) && !StringUtil.endsWith(fileName, StringPool.PERIOD + extension)) { fileName += StringPool.PERIOD + extension; } if (fileName.length() > 255) { int x = fileName.length() - 1; if (Validator.isNotNull(extension)) { x = fileName.lastIndexOf(StringPool.PERIOD); } int y = x - (fileName.length() - 255); fileName = fileName.substring(0, y) + fileName.substring(x); } return fileName; } @Override public String getTempFileId(long id, String version) { return getTempFileId(id, version, null); } @Override public String getTempFileId(long id, String version, String languageId) { if (Validator.isNull(languageId)) { return String.valueOf(id).concat(StringPool.PERIOD).concat(version); } StringBundler sb = new StringBundler(5); sb.append(id); sb.append(StringPool.PERIOD); sb.append(version); sb.append(StringPool.PERIOD); sb.append(languageId); return sb.toString(); } /** * @deprecated As of 7.0.0, replaced by {@link #getThumbnailSrc(FileEntry, * ThemeDisplay)} */ @Deprecated @Override public String getThumbnailSrc(FileEntry fileEntry, DLFileShortcut dlFileShortcut, ThemeDisplay themeDisplay) throws Exception { return getThumbnailSrc(fileEntry, fileEntry.getFileVersion(), themeDisplay); } /** * @deprecated As of 7.0.0, replaced by {@link #getThumbnailSrc(FileEntry, * FileVersion, ThemeDisplay)} */ @Deprecated @Override public String getThumbnailSrc(FileEntry fileEntry, FileVersion fileVersion, DLFileShortcut dlFileShortcut, ThemeDisplay themeDisplay) throws Exception { return getThumbnailSrc(fileEntry, fileVersion, themeDisplay); } @Override public String getThumbnailSrc(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay) throws Exception { String thumbnailQueryString = null; if (PropsValues.DL_FILE_ENTRY_THUMBNAIL_ENABLED) { if (ImageProcessorUtil.hasImages(fileVersion)) { thumbnailQueryString = "&imageThumbnail=1"; } else if (PDFProcessorUtil.hasImages(fileVersion)) { thumbnailQueryString = "&documentThumbnail=1"; } else if (VideoProcessorUtil.hasVideo(fileVersion)) { thumbnailQueryString = "&videoThumbnail=1"; } } return getImageSrc(fileEntry, fileVersion, themeDisplay, thumbnailQueryString); } @Override public String getThumbnailSrc(FileEntry fileEntry, ThemeDisplay themeDisplay) throws Exception { return getThumbnailSrc(fileEntry, fileEntry.getFileVersion(), themeDisplay); } @Override public String getThumbnailStyle() throws Exception { return getThumbnailStyle(true, 0); } @Override public String getThumbnailStyle(boolean max, int margin) throws Exception { StringBundler sb = new StringBundler(5); if (max) { sb.append("max-height: "); } else { sb.append("height: "); } sb.append(PrefsPropsUtil.getLong(PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_HEIGHT) + 2 * margin); if (max) { sb.append("px; max-width: "); } else { sb.append("px; width: "); } sb.append(PrefsPropsUtil.getLong(PropsKeys.DL_FILE_ENTRY_THUMBNAIL_MAX_WIDTH) + 2 * margin); sb.append("px;"); return sb.toString(); } @Override public String getTitleWithExtension(FileEntry fileEntry) { String title = fileEntry.getTitle(); String extension = fileEntry.getExtension(); return getTitleWithExtension(title, extension); } @Override public String getTitleWithExtension(String title, String extension) { if (Validator.isNotNull(extension)) { String periodAndExtension = StringPool.PERIOD.concat(extension); if (!title.endsWith(periodAndExtension)) { title += periodAndExtension; } } return title; } @Override public String getWebDavURL(ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry) throws PortalException { return getWebDavURL(themeDisplay, folder, fileEntry, false); } @Override public String getWebDavURL(ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry, boolean manualCheckInRequired) throws PortalException { return getWebDavURL(themeDisplay, folder, fileEntry, manualCheckInRequired, false); } @Override public String getWebDavURL(ThemeDisplay themeDisplay, Folder folder, FileEntry fileEntry, boolean manualCheckInRequired, boolean openDocumentUrl) throws PortalException { StringBundler webDavURL = new StringBundler(8); boolean secure = false; if (themeDisplay.isSecure() || PropsValues.WEBDAV_SERVLET_HTTPS_REQUIRED) { secure = true; } String portalURL = PortalUtil.getPortalURL(themeDisplay.getServerName(), themeDisplay.getServerPort(), secure); webDavURL.append(portalURL); webDavURL.append(themeDisplay.getPathContext()); webDavURL.append("/webdav"); if (manualCheckInRequired) { webDavURL.append(MANUAL_CHECK_IN_REQUIRED_PATH); } String fileEntryFileName = null; Group group = null; if (fileEntry != null) { fileEntryFileName = HtmlUtil.unescape(fileEntry.getFileName()); group = GroupLocalServiceUtil.getGroup(fileEntry.getGroupId()); } else { group = themeDisplay.getScopeGroup(); } webDavURL.append(group.getFriendlyURL()); webDavURL.append("/document_library"); StringBuilder sb = new StringBuilder(); if ((folder != null) && (folder.getFolderId() != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID)) { Folder curFolder = folder; while (true) { sb.insert(0, HttpUtil.encodeURL(curFolder.getName(), true)); sb.insert(0, StringPool.SLASH); if (curFolder.getParentFolderId() == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { break; } curFolder = DLAppLocalServiceUtil.getFolder(curFolder.getParentFolderId()); } } if (fileEntry != null) { sb.append(StringPool.SLASH); sb.append(HttpUtil.encodeURL(fileEntryFileName, true)); } webDavURL.append(sb.toString()); return webDavURL.toString(); } @Override public boolean hasWorkflowDefinitionLink(long companyId, long groupId, long folderId, long fileEntryTypeId) throws Exception { while (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { DLFolder dlFolder = DLFolderLocalServiceUtil.fetchDLFolder(folderId); if (dlFolder == null) { return false; } if (dlFolder.getRestrictionType() != DLFolderConstants.RESTRICTION_TYPE_INHERIT) { break; } folderId = dlFolder.getParentFolderId(); } if (WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(companyId, groupId, DLFolderConstants.getClassName(), folderId, fileEntryTypeId) || WorkflowDefinitionLinkLocalServiceUtil.hasWorkflowDefinitionLink(companyId, groupId, DLFolderConstants.getClassName(), folderId, DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_ALL)) { return true; } return false; } @Override public boolean isAutoGeneratedDLFileEntryTypeDDMStructureKey(String ddmStructureKey) { if (ddmStructureKey.startsWith(_STRUCTURE_KEY_PREFIX)) { return true; } return false; } @Override public boolean isOfficeExtension(String extension) { return ArrayUtil.contains(_MICROSOFT_OFFICE_EXTENSIONS, extension); } @Override public boolean isSubscribedToFileEntryType(long companyId, long groupId, long userId, long fileEntryTypeId) { if (fileEntryTypeId == DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) { fileEntryTypeId = groupId; } return SubscriptionLocalServiceUtil.isSubscribed(companyId, userId, DLFileEntryType.class.getName(), fileEntryTypeId); } @Override public boolean isSubscribedToFolder(long companyId, long groupId, long userId, long folderId) throws PortalException { return isSubscribedToFolder(companyId, groupId, userId, folderId, true); } @Override public boolean isSubscribedToFolder(long companyId, long groupId, long userId, long folderId, boolean recursive) throws PortalException { List<Long> ancestorFolderIds = new ArrayList<>(); if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) { Folder folder = DLAppLocalServiceUtil.getFolder(folderId); ancestorFolderIds.add(folderId); if (recursive) { ancestorFolderIds.addAll(folder.getAncestorFolderIds()); ancestorFolderIds.add(groupId); } } else { ancestorFolderIds.add(groupId); } long[] folderIdsArray = ArrayUtil.toLongArray(ancestorFolderIds); return SubscriptionLocalServiceUtil.isSubscribed(companyId, userId, DLFolder.class.getName(), folderIdsArray); } @Override public boolean isValidVersion(String version) { if (version.equals(DLFileEntryConstants.PRIVATE_WORKING_COPY_VERSION)) { return true; } String[] versionParts = StringUtil.split(version, StringPool.PERIOD); if (versionParts.length != 2) { return false; } if (Validator.isNumber(versionParts[0]) && Validator.isNumber(versionParts[1])) { return true; } return false; } @Override public void startWorkflowInstance(long userId, DLFileVersion dlFileVersion, String syncEventType, ServiceContext serviceContext) throws PortalException { Map<String, Serializable> workflowContext = new HashMap<>(); workflowContext.put(WorkflowConstants.CONTEXT_URL, getEntryURL(dlFileVersion, serviceContext)); workflowContext.put("event", syncEventType); WorkflowHandlerRegistryUtil.startWorkflowInstance(dlFileVersion.getCompanyId(), dlFileVersion.getGroupId(), userId, DLFileEntryConstants.getClassName(), dlFileVersion.getFileVersionId(), dlFileVersion, serviceContext, workflowContext); } protected String getEntryURL(DLFileVersion dlFileVersion, ServiceContext serviceContext) throws PortalException { if (Validator.equals(serviceContext.getCommand(), Constants.ADD_WEBDAV) || Validator.equals(serviceContext.getCommand(), Constants.UPDATE_WEBDAV)) { return serviceContext.getPortalURL() + serviceContext.getCurrentURL(); } String entryURL = GetterUtil.getString(serviceContext.getAttribute("entryURL")); if (Validator.isNotNull(entryURL)) { return entryURL; } HttpServletRequest request = serviceContext.getRequest(); if ((request == null) || (serviceContext.getThemeDisplay() == null)) { return StringPool.BLANK; } long plid = serviceContext.getPlid(); long controlPanelPlid = PortalUtil.getControlPanelPlid(serviceContext.getCompanyId()); if (plid == controlPanelPlid) { plid = PortalUtil.getPlidFromPortletId(dlFileVersion.getGroupId(), PortletKeys.DOCUMENT_LIBRARY); } if (plid == LayoutConstants.DEFAULT_PLID) { plid = controlPanelPlid; } PortletURL portletURL = PortletURLFactoryUtil.create(request, PortletKeys.DOCUMENT_LIBRARY, plid, PortletRequest.RENDER_PHASE); portletURL.setParameter("struts_action", "/document_library/view_file_entry"); portletURL.setParameter("fileEntryId", String.valueOf(dlFileVersion.getFileEntryId())); return portletURL.toString(); } protected String getImageSrc(FileEntry fileEntry, FileVersion fileVersion, ThemeDisplay themeDisplay, String queryString) throws Exception { StringBundler sb = new StringBundler(4); sb.append(themeDisplay.getPathThemeImages()); sb.append("/file_system/large/"); sb.append(getGenericName(fileEntry.getExtension())); sb.append(".png"); String thumbnailSrc = sb.toString(); if (Validator.isNotNull(queryString)) { thumbnailSrc = getPreviewURL(fileEntry, fileVersion, themeDisplay, queryString, true, true); } return thumbnailSrc; } private static void _populateGenericNamesMap(String genericName) { String[] extensions = PropsUtil.getArray(PropsKeys.DL_FILE_GENERIC_EXTENSIONS, new Filter(genericName)); for (String extension : extensions) { _genericNames.put(extension, genericName); } } private static final String _DEFAULT_FILE_ICON = "page"; private static final String _DEFAULT_GENERIC_NAME = "default"; private static final long _DIVISOR = 256; private static final String[] _MICROSOFT_OFFICE_EXTENSIONS = { "accda", "accdb", "accdc", "accde", "accdp", "accdr", "accdt", "accdu", "acl", "ade", "adp", "asd", "cnv", "crtx", "doc", "docm", "docx", "dot", "dotm", "dotx", "grv", "iaf", "laccdb", "maf", "mam", "maq", "mar", "mat", "mda", "mdb", "mde", "mdt", "mdw", "mpd", "mpp", "mpt", "oab", "obi", "oft", "olm", "one", "onepkg", "ops", "ost", "pa", "pip", "pot", "potm", "potx", "ppa", "ppam", "pps", "ppsm", "ppsx", "ppt", "pptm", "pptx", "prf", "pst", "pub", "puz", "rpmsg", "sldm", "sldx", "slk", "snp", "svd", "thmx", "vdx", "vrge08message", "vsd", "vss", "vst", "vsx", "vtx", "wbk", "wll", "xar", "xl", "xla", "xlam", "xlb", "xlc", "xll", "xlm", "xls", "xlsb", "xlsm", "xlsx", "xlt", "xltm", "xltx", "xlw", "xsf", "xsn" }; private static final String _STRUCTURE_KEY_PREFIX = "AUTO_"; private static final Log _log = LogFactoryUtil.getLog(DLImpl.class); private static final Set<String> _allMediaGalleryMimeTypes = new TreeSet<>(); private static final Set<String> _fileIcons = new HashSet<>(); private static final Map<String, String> _genericNames = new HashMap<>(); static { _allMediaGalleryMimeTypes .addAll(SetUtil.fromArray(PropsUtil.getArray(PropsKeys.DL_FILE_ENTRY_PREVIEW_AUDIO_MIME_TYPES))); _allMediaGalleryMimeTypes .addAll(SetUtil.fromArray(PropsUtil.getArray(PropsKeys.DL_FILE_ENTRY_PREVIEW_VIDEO_MIME_TYPES))); _allMediaGalleryMimeTypes .addAll(SetUtil.fromArray(PropsUtil.getArray(PropsKeys.DL_FILE_ENTRY_PREVIEW_IMAGE_MIME_TYPES))); String[] fileIcons = null; try { fileIcons = PropsUtil.getArray(PropsKeys.DL_FILE_ICONS); } catch (Exception e) { if (_log.isDebugEnabled()) { _log.debug(e, e); } fileIcons = new String[] { StringPool.BLANK }; } for (int i = 0; i < fileIcons.length; i++) { // Only process non wildcard extensions if (!StringPool.STAR.equals(fileIcons[i])) { // Strip starting period String extension = fileIcons[i]; if (extension.length() > 0) { extension = extension.substring(1); } _fileIcons.add(extension); } } String[] genericNames = PropsUtil.getArray(PropsKeys.DL_FILE_GENERIC_NAMES); for (String genericName : genericNames) { _populateGenericNamesMap(genericName); } } }