/** * 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.document.library.repository.external; import com.liferay.document.library.kernel.exception.NoSuchFileEntryException; import com.liferay.document.library.kernel.exception.NoSuchFileVersionException; import com.liferay.document.library.kernel.exception.NoSuchFolderException; import com.liferay.document.library.kernel.model.DLFileEntryTypeConstants; import com.liferay.document.library.kernel.model.DLFolder; import com.liferay.document.library.kernel.service.DLFolderLocalServiceUtil; import com.liferay.document.library.repository.external.model.ExtRepositoryFileEntryAdapter; import com.liferay.document.library.repository.external.model.ExtRepositoryFileVersionAdapter; import com.liferay.document.library.repository.external.model.ExtRepositoryFolderAdapter; import com.liferay.document.library.repository.external.model.ExtRepositoryObjectAdapter; import com.liferay.document.library.repository.external.model.ExtRepositoryObjectAdapterType; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.exception.NoSuchRepositoryEntryException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.lock.Lock; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.CompanyConstants; import com.liferay.portal.kernel.model.RepositoryEntry; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.repository.BaseRepositoryImpl; import com.liferay.portal.kernel.repository.RepositoryException; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.repository.model.FileShortcut; 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.DocumentImpl; import com.liferay.portal.kernel.search.Field; import com.liferay.portal.kernel.search.Hits; import com.liferay.portal.kernel.search.HitsImpl; import com.liferay.portal.kernel.search.Query; import com.liferay.portal.kernel.search.QueryConfig; import com.liferay.portal.kernel.search.SearchContext; import com.liferay.portal.kernel.search.SearchException; import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Time; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.workflow.WorkflowConstants; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; /** * @author Iván Zaera * @author Sergio González */ public class ExtRepositoryAdapter extends BaseRepositoryImpl { @Override public FileEntry addFileEntry( long userId, long folderId, String sourceFileName, String mimeType, String title, String description, String changeLog, InputStream inputStream, long size, ServiceContext serviceContext) throws PortalException { String fileName = null; if (Validator.isNull(title)) { fileName = sourceFileName; } else { fileName = title; } String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.addExtRepositoryFileEntry( extRepositoryFolderKey, mimeType, fileName, description, changeLog, inputStream); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntry); } @Override public FileShortcut addFileShortcut( long userId, long folderId, long toFileEntryId, ServiceContext serviceContext) { throw new UnsupportedOperationException(); } @Override public ExtRepositoryFolderAdapter addFolder( long userId, long parentFolderId, String name, String description, ServiceContext serviceContext) throws PortalException { String extRepositoryParentFolderKey = getExtRepositoryObjectKey( parentFolderId); ExtRepositoryFolder extRepositoryFolder = _extRepository.addExtRepositoryFolder( extRepositoryParentFolderKey, name, description); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FOLDER, extRepositoryFolder); } @Override public FileVersion cancelCheckOut(long fileEntryId) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); ExtRepositoryFileVersion extRepositoryFileVersion = _extRepository.cancelCheckOut(extRepositoryFileEntryKey); if (extRepositoryFileVersion != null) { ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter = getFileEntry(fileEntryId); return _toExtRepositoryFileVersionAdapter( extRepositoryFileEntryAdapter, extRepositoryFileVersion); } return null; } @Override public void checkInFileEntry( long userId, long fileEntryId, boolean major, String changeLog, ServiceContext serviceContext) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); _extRepository.checkInExtRepositoryFileEntry( extRepositoryFileEntryKey, major, changeLog); } @Override public void checkInFileEntry( long userId, long fileEntryId, String lockUuid, ServiceContext serviceContext) throws PortalException { checkInFileEntry( userId, fileEntryId, false, StringPool.BLANK, serviceContext); } @Override public FileEntry checkOutFileEntry( long fileEntryId, ServiceContext serviceContext) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.checkOutExtRepositoryFileEntry( extRepositoryFileEntryKey); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntry); } /** * @throws PortalException */ @Override public FileEntry checkOutFileEntry( long fileEntryId, String owner, long expirationTime, ServiceContext serviceContext) throws PortalException { throw new UnsupportedOperationException(); } @Override public FileEntry copyFileEntry( long userId, long groupId, long fileEntryId, long destFolderId, ServiceContext serviceContext) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); String newExtRepositoryFolderKey = getExtRepositoryObjectKey( destFolderId); ExtRepositoryFileEntry copyExtRepositoryFileEntry = _extRepository.copyExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey, newExtRepositoryFolderKey, extRepositoryFileEntry.getTitle()); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, copyExtRepositoryFileEntry); } @Override public void deleteFileEntry(long fileEntryId) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); _extRepository.deleteExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance(); extRepositoryAdapterCache.remove(extRepositoryFileEntryKey); } @Override public void deleteFileShortcut(long fileShortcutId) { throw new UnsupportedOperationException(); } @Override public void deleteFileShortcuts(long toFileEntryId) { throw new UnsupportedOperationException(); } @Override public void deleteFolder(long folderId) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); _extRepository.deleteExtRepositoryObject( ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey); ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance(); extRepositoryAdapterCache.remove(extRepositoryFolderKey); } public String getAuthType() { return _extRepository.getAuthType(); } public InputStream getContentStream( ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter) throws PortalException { return _extRepository.getContentStream( extRepositoryFileEntryAdapter.getExtRepositoryModel()); } public InputStream getContentStream( ExtRepositoryFileVersionAdapter extRepositoryFileVersionAdapter) throws PortalException { return _extRepository.getContentStream( extRepositoryFileVersionAdapter.getExtRepositoryModel()); } public List<ExtRepositoryFileVersionAdapter> getExtRepositoryFileVersionAdapters( ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter) throws PortalException { List<ExtRepositoryFileVersion> extRepositoryFileVersions = _extRepository.getExtRepositoryFileVersions( extRepositoryFileEntryAdapter.getExtRepositoryModel()); return _toExtRepositoryFileVersionAdapters( extRepositoryFileEntryAdapter, extRepositoryFileVersions); } @Override public List<FileEntry> getFileEntries( long folderId, int status, int start, int end, OrderByComparator<FileEntry> obc) throws PortalException { return getFileEntries(folderId, start, end, obc); } @Override public List<FileEntry> getFileEntries( long folderId, int start, int end, OrderByComparator<FileEntry> obc) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); List<ExtRepositoryFileEntry> extRepositoryFileEntries = _extRepository.getExtRepositoryObjects( ExtRepositoryObjectType.FILE, extRepositoryFolderKey); List<ExtRepositoryFileEntryAdapter> extRepositoryFileEntryAdapters = _toExtRepositoryObjectAdapters( ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntries); return _sublist(extRepositoryFileEntryAdapters, start, end, obc); } @Override public List<FileEntry> getFileEntries( long folderId, long fileEntryTypeId, int start, int end, OrderByComparator<FileEntry> obc) throws PortalException { if (fileEntryTypeId == DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) { return getFileEntries(folderId, start, end, obc); } else { return Collections.emptyList(); } } @Override public List<FileEntry> getFileEntries( long folderId, String[] mimeTypes, int start, int end, OrderByComparator<FileEntry> obc) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); List<ExtRepositoryFileEntry> extRepositoryFileEntries = _extRepository.getExtRepositoryObjects( ExtRepositoryObjectType.FILE, extRepositoryFolderKey); List<ExtRepositoryFileEntryAdapter> extRepositoryFileEntryAdapters = _toExtRepositoryObjectAdapters( ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntries); extRepositoryFileEntryAdapters = _filterByMimeType( extRepositoryFileEntryAdapters, mimeTypes); return _sublist(extRepositoryFileEntryAdapters, start, end, obc); } @Override public int getFileEntriesCount(long folderId) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); return _extRepository.getExtRepositoryObjectsCount( ExtRepositoryObjectType.FILE, extRepositoryFolderKey); } @Override public int getFileEntriesCount(long folderId, int status) throws PortalException { return getFileEntriesCount(folderId); } @Override public int getFileEntriesCount(long folderId, long fileEntryTypeId) throws PortalException { if (fileEntryTypeId == DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); return _extRepository.getExtRepositoryObjectsCount( ExtRepositoryObjectType.FILE, extRepositoryFolderKey); } return 0; } @Override public int getFileEntriesCount(long folderId, String[] mimeTypes) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); return _extRepository.getExtRepositoryObjectsCount( ExtRepositoryObjectType.FILE, extRepositoryFolderKey); } @Override public ExtRepositoryFileEntryAdapter getFileEntry(long fileEntryId) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); ExtRepositoryObject extRepositoryObject = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, extRepositoryObject); } @Override public FileEntry getFileEntry(long folderId, String title) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); ExtRepositoryObject extRepositoryObject = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFolderKey, title); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, extRepositoryObject); } @Override public FileEntry getFileEntryByUuid(String uuid) throws PortalException { String extRepositoryFileEntryKey = _getExtRepositoryObjectKey(uuid); ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntry); } @Override public FileShortcut getFileShortcut(long fileShortcutId) { throw new UnsupportedOperationException(); } @Override public FileVersion getFileVersion(long fileVersionId) throws PortalException { String extRepositoryFileVersionKey = getExtRepositoryObjectKey( fileVersionId); ExtRepositoryFileVersionDescriptor extRepositoryFileVersionDescriptor = _extRepository.getExtRepositoryFileVersionDescriptor( extRepositoryFileVersionKey); String extRepositoryFileEntryKey = extRepositoryFileVersionDescriptor.getExtRepositoryFileEntryKey(); String version = extRepositoryFileVersionDescriptor.getVersion(); ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); ExtRepositoryFileVersion extRepositoryFileVersion = _extRepository.getExtRepositoryFileVersion( extRepositoryFileEntry, version); if (extRepositoryFileVersion == null) { return null; } ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter = _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntry); return _toExtRepositoryFileVersionAdapter( extRepositoryFileEntryAdapter, extRepositoryFileVersion); } @Override public ExtRepositoryFolderAdapter getFolder(long folderId) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); ExtRepositoryFolder extRepositoryFolder = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FOLDER, extRepositoryFolder); } @Override public ExtRepositoryFolderAdapter getFolder( long parentFolderId, String name) throws PortalException { String extRepositoryParentFolderKey = getExtRepositoryObjectKey( parentFolderId); ExtRepositoryFolder extRepositoryFolder = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FOLDER, extRepositoryParentFolderKey, name); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FOLDER, extRepositoryFolder); } @Override public List<Folder> getFolders( long parentFolderId, boolean includeMountFolders, int start, int end, OrderByComparator<Folder> obc) throws PortalException { String extRepositoryParentFolderKey = getExtRepositoryObjectKey( parentFolderId); List<ExtRepositoryFolder> extRepositoryFolders = _extRepository.getExtRepositoryObjects( ExtRepositoryObjectType.FOLDER, extRepositoryParentFolderKey); List<ExtRepositoryFolderAdapter> extRepositoryFolderAdapters = _toExtRepositoryObjectAdapters( ExtRepositoryObjectAdapterType.FOLDER, extRepositoryFolders); return _sublist(extRepositoryFolderAdapters, start, end, obc); } @Override public List<Object> getFoldersAndFileEntries( long folderId, int start, int end, OrderByComparator<?> obc) { try { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); List<? extends ExtRepositoryObject> extRepositoryObjects = _extRepository.getExtRepositoryObjects( ExtRepositoryObjectType.OBJECT, extRepositoryFolderKey); List<ExtRepositoryObjectAdapter<?>> extRepositoryObjectAdapters = _toExtRepositoryObjectAdapters( ExtRepositoryObjectAdapterType.OBJECT, extRepositoryObjects); return _sublist( extRepositoryObjectAdapters, start, end, (OrderByComparator<Object>)obc); } catch (Exception e) { throw new RepositoryException(e); } } @Override public List<Object> getFoldersAndFileEntries( long folderId, String[] mimeTypes, int start, int end, OrderByComparator<?> obc) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); List<ExtRepositoryObject> extRepositoryObjects = _extRepository.getExtRepositoryObjects( ExtRepositoryObjectType.OBJECT, extRepositoryFolderKey); List<ExtRepositoryObjectAdapter<?>> extRepositoryObjectAdapters = _toExtRepositoryObjectAdapters( ExtRepositoryObjectAdapterType.OBJECT, extRepositoryObjects); extRepositoryObjectAdapters = _filterByMimeType( extRepositoryObjectAdapters, mimeTypes); return _sublist( extRepositoryObjectAdapters, start, end, (OrderByComparator<Object>)obc); } @Override public int getFoldersAndFileEntriesCount(long folderId) { try { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); return _extRepository.getExtRepositoryObjectsCount( ExtRepositoryObjectType.OBJECT, extRepositoryFolderKey); } catch (PortalException pe) { throw new SystemException(pe); } } @Override public int getFoldersAndFileEntriesCount(long folderId, String[] mimeTypes) throws PortalException { List<Object> extRepositoryObjects = getFoldersAndFileEntries( folderId, mimeTypes, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null); return extRepositoryObjects.size(); } @Override public int getFoldersCount(long parentFolderId, boolean includeMountfolders) throws PortalException { String extRepositoryParentFolderKey = getExtRepositoryObjectKey( parentFolderId); return _extRepository.getExtRepositoryObjectsCount( ExtRepositoryObjectType.FOLDER, extRepositoryParentFolderKey); } @Override public int getFoldersFileEntriesCount(List<Long> folderIds, int status) throws PortalException { int count = 0; for (long folderId : folderIds) { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); count += _extRepository.getExtRepositoryObjectsCount( ExtRepositoryObjectType.FILE, extRepositoryFolderKey); } return count; } public String getLiferayLogin(String extRepositoryUserName) { return _extRepository.getLiferayLogin(extRepositoryUserName); } @Override @SuppressWarnings("unused") public List<Folder> getMountFolders( long parentFolderId, int start, int end, OrderByComparator<Folder> obc) throws PortalException { return Collections.emptyList(); } @Override @SuppressWarnings("unused") public int getMountFoldersCount(long parentFolderId) throws PortalException { return 0; } public ExtRepositoryFolderAdapter getParentFolder( ExtRepositoryObjectAdapter<?> extRepositoryObjectAdapter) throws PortalException { ExtRepositoryFolder parentFolder = _extRepository.getExtRepositoryParentFolder( extRepositoryObjectAdapter.getExtRepositoryModel()); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FOLDER, parentFolder); } @Override public void getSubfolderIds(List<Long> folderIds, long folderId) throws PortalException { folderIds.addAll(getSubfolderIds(folderId, true)); } @Override public List<Long> getSubfolderIds(long folderId, boolean recurse) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); List<String> extRepositorySubfolderKeys = _extRepository.getSubfolderKeys(extRepositoryFolderKey, recurse); List<Long> subfolderIds = new ArrayList<>(); for (String extRepositorySubfolderKey : extRepositorySubfolderKeys) { RepositoryEntry repositoryEntry = getRepositoryEntry( extRepositorySubfolderKey); subfolderIds.add(repositoryEntry.getRepositoryEntryId()); } return subfolderIds; } @Override public String[] getSupportedConfigurations() { return _extRepository.getSupportedConfigurations(); } @Override public String[][] getSupportedParameters() { return _extRepository.getSupportedParameters(); } @Override public void initRepository() throws PortalException { try { CredentialsProvider credentialsProvider = new CredentialsProvider() { @Override public String getLogin() { return _getLogin(); } @Override public String getPassword() { return _getPassword(); } }; _extRepository.initRepository( getTypeSettingsProperties(), credentialsProvider); } catch (PortalException | SystemException e) { if (_log.isWarnEnabled()) { _log.warn( "Unable to initialize repository " + _extRepository, e); } throw e; } } @Override @SuppressWarnings("unused") public Lock lockFolder(long folderId) throws PortalException { throw new UnsupportedOperationException(); } @Override @SuppressWarnings("unused") public Lock lockFolder( long folderId, String owner, boolean inheritable, long expirationTime) throws PortalException { throw new UnsupportedOperationException(); } @Override public FileEntry moveFileEntry( long userId, long fileEntryId, long newFolderId, ServiceContext serviceContext) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); String extRepositoryNewFolderKey = getExtRepositoryObjectKey( newFolderId); ExtRepositoryFileEntry moveExtRepositoryFileEntry = _extRepository.moveExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey, extRepositoryNewFolderKey, extRepositoryFileEntry.getTitle()); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, moveExtRepositoryFileEntry); } @Override public ExtRepositoryFolderAdapter moveFolder( long userId, long folderId, long newParentFolderId, ServiceContext serviceContext) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); ExtRepositoryFolder extRepositoryFolder = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey); String extRepositoryNewParentFolderKey = getExtRepositoryObjectKey( newParentFolderId); ExtRepositoryFolder moveExtRepositoryFolder = _extRepository.moveExtRepositoryObject( ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey, extRepositoryNewParentFolderKey, extRepositoryFolder.getName()); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FOLDER, moveExtRepositoryFolder); } @Override @SuppressWarnings("unused") public Lock refreshFileEntryLock( String lockUuid, long companyId, long expirationTime) throws PortalException { throw new UnsupportedOperationException(); } @Override @SuppressWarnings("unused") public Lock refreshFolderLock( String lockUuid, long companyId, long expirationTime) throws PortalException { throw new UnsupportedOperationException(); } @Override public void revertFileEntry( long userId, long fileEntryId, String version, ServiceContext serviceContext) throws PortalException { String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); ExtRepositoryFileVersion extRepositoryFileVersion = null; List<ExtRepositoryFileVersion> extRepositoryFileVersions = _extRepository.getExtRepositoryFileVersions(extRepositoryFileEntry); for (ExtRepositoryFileVersion curExtRepositoryFileVersion : extRepositoryFileVersions) { String curVersion = curExtRepositoryFileVersion.getVersion(); if (curVersion.equals(version)) { extRepositoryFileVersion = curExtRepositoryFileVersion; break; } } if (extRepositoryFileVersion != null) { InputStream inputStream = _extRepository.getContentStream( extRepositoryFileVersion); boolean needsCheckIn = false; if (!isCheckedOut(extRepositoryFileEntry)) { try { _extRepository.checkOutExtRepositoryFileEntry( extRepositoryFileEntryKey); needsCheckIn = true; } catch (UnsupportedOperationException uoe) { } } _extRepository.updateExtRepositoryFileEntry( extRepositoryFileEntryKey, extRepositoryFileVersion.getMimeType(), inputStream); String changeLog = LanguageUtil.format( serviceContext.getLocale(), "reverted-to-x", version, false); if (needsCheckIn) { try { _extRepository.checkInExtRepositoryFileEntry( extRepositoryFileEntryKey, true, changeLog); } catch (UnsupportedOperationException uoe) { } } } else { throw new NoSuchFileVersionException( "No file version with {extRepositoryModelKey=" + extRepositoryFileEntry.getExtRepositoryModelKey() + ", version: " + version + "}"); } } @Override @SuppressWarnings("unused") public Hits search(long creatorUserId, int status, int start, int end) throws PortalException { throw new UnsupportedOperationException(); } @Override @SuppressWarnings("unused") public Hits search( long creatorUserId, long folderId, String[] mimeTypes, int status, int start, int end) throws PortalException { throw new UnsupportedOperationException(); } @Override public Hits search(SearchContext searchContext, Query query) throws SearchException { long startTime = System.currentTimeMillis(); List<ExtRepositorySearchResult<?>> extRepositorySearchResults = null; try { extRepositorySearchResults = _extRepository.search( searchContext, query, new ExtRepositoryQueryMapperImpl(this)); } catch (PortalException | SystemException e) { throw new SearchException("Unable to perform search", e); } QueryConfig queryConfig = searchContext.getQueryConfig(); List<Document> documents = new ArrayList<>(); List<String> snippets = new ArrayList<>(); List<Float> scores = new ArrayList<>(); int total = 0; for (ExtRepositorySearchResult<?> extRepositorySearchResult : extRepositorySearchResults) { try { ExtRepositoryObjectAdapter<?> extRepositoryEntryAdapter = _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.OBJECT, extRepositorySearchResult.getObject()); Document document = new DocumentImpl(); document.addKeyword( Field.ENTRY_CLASS_NAME, extRepositoryEntryAdapter.getModelClassName()); document.addKeyword( Field.ENTRY_CLASS_PK, extRepositoryEntryAdapter.getPrimaryKey()); document.addKeyword( Field.TITLE, extRepositoryEntryAdapter.getName()); documents.add(document); if (queryConfig.isScoreEnabled()) { scores.add(extRepositorySearchResult.getScore()); } else { scores.add(1.0F); } snippets.add(extRepositorySearchResult.getSnippet()); total++; } catch (PortalException | SystemException e) { if (_log.isWarnEnabled()) { _log.warn("Invalid entry returned from search", e); } } } float searchTime = (float)(System.currentTimeMillis() - startTime) / Time.SECOND; Hits hits = new HitsImpl(); hits.setDocs(documents.toArray(new Document[documents.size()])); hits.setLength(total); hits.setQueryTerms(new String[0]); hits.setScores(ArrayUtil.toFloatArray(scores)); hits.setSearchTime(searchTime); hits.setSnippets(snippets.toArray(new String[snippets.size()])); hits.setStart(startTime); return hits; } @Override @SuppressWarnings("unused") public void unlockFolder(long folderId, String lockUuid) throws PortalException { throw new UnsupportedOperationException(); } @Override public FileEntry updateFileEntry( long userId, long fileEntryId, String sourceFileName, String mimeType, String title, String description, String changeLog, boolean majorVersion, InputStream inputStream, long size, ServiceContext serviceContext) throws PortalException { boolean needsCheckIn = false; String extRepositoryFileEntryKey = getExtRepositoryObjectKey( fileEntryId); try { ExtRepositoryFileEntry extRepositoryFileEntry = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey); if (!isCheckedOut(extRepositoryFileEntry)) { _extRepository.checkOutExtRepositoryFileEntry( extRepositoryFileEntryKey); needsCheckIn = true; } if (inputStream != null) { extRepositoryFileEntry = _extRepository.updateExtRepositoryFileEntry( extRepositoryFileEntryKey, mimeType, inputStream); } if (!title.equals(extRepositoryFileEntry.getTitle())) { ExtRepositoryFolder folder = _extRepository.getExtRepositoryParentFolder( extRepositoryFileEntry); extRepositoryFileEntry = _extRepository.moveExtRepositoryObject( ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey, folder.getExtRepositoryModelKey(), title); ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance(); extRepositoryAdapterCache.clear(); } if (needsCheckIn) { _extRepository.checkInExtRepositoryFileEntry( extRepositoryFileEntryKey, majorVersion, changeLog); needsCheckIn = false; } return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntry); } catch (PortalException | SystemException e) { if (needsCheckIn) { _extRepository.cancelCheckOut(extRepositoryFileEntryKey); } throw e; } } @Override public FileShortcut updateFileShortcut( long userId, long fileShortcutId, long folderId, long toFileEntryId, ServiceContext serviceContext) { throw new UnsupportedOperationException(); } @Override public void updateFileShortcuts( long oldToFileEntryId, long newToFileEntryId) { throw new UnsupportedOperationException(); } @Override public ExtRepositoryFolderAdapter updateFolder( long folderId, String name, String description, ServiceContext serviceContext) throws PortalException { String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId); ExtRepositoryFolder extRepositoryFolder = _extRepository.getExtRepositoryObject( ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey); ExtRepositoryFolder parentExtRepositoryFolder = _extRepository.getExtRepositoryParentFolder(extRepositoryFolder); ExtRepositoryFolder newExtRepositoryFolder = _extRepository.moveExtRepositoryObject( ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey, parentExtRepositoryFolder.getExtRepositoryModelKey(), name); ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance(); extRepositoryAdapterCache.remove(extRepositoryFolderKey); return _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType.FOLDER, newExtRepositoryFolder); } @Override @SuppressWarnings("unused") public boolean verifyFileEntryCheckOut(long fileEntryId, String lockUuid) throws PortalException { throw new UnsupportedOperationException(); } @Override @SuppressWarnings("unused") public boolean verifyInheritableLock(long folderId, String lockUuid) throws PortalException { throw new UnsupportedOperationException(); } protected ExtRepositoryAdapter(ExtRepository extRepository) { if (extRepository == null) { extRepository = (ExtRepository)this; } _extRepository = extRepository; } protected String getExtRepositoryObjectKey(long repositoryEntryId) throws PortalException { RepositoryEntry repositoryEntry = repositoryEntryLocalService.fetchRepositoryEntry(repositoryEntryId); if (repositoryEntry != null) { return repositoryEntry.getMappedId(); } DLFolder rootMountDLFolder = DLFolderLocalServiceUtil.getDLFolder( repositoryEntryId); repositoryEntry = _getRootRepositoryEntry(rootMountDLFolder); return repositoryEntry.getMappedId(); } protected boolean isCheckedOut( ExtRepositoryFileEntry extRepositoryFileEntry) { String checkedOutBy = extRepositoryFileEntry.getCheckedOutBy(); if (Validator.isNull(checkedOutBy)) { return false; } return true; } private void _checkAssetEntry( ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter) throws PortalException { dlAppHelperLocalService.checkAssetEntry( PrincipalThreadLocal.getUserId(), extRepositoryFileEntryAdapter, extRepositoryFileEntryAdapter.getFileVersion()); } private User _fetchDefaultUser() { try { return userLocalService.getDefaultUser(getCompanyId()); } catch (PortalException pe) { _log.error( "Unable to get default user for company " + getCompanyId(), pe); return null; } } private <T extends ExtRepositoryObjectAdapter<?>> List<T> _filterByMimeType( List<T> extRepositoryObjects, String[] mimeTypes) { if (ArrayUtil.isEmpty(mimeTypes)) { return extRepositoryObjects; } Set<String> allowedMimeTypes = new HashSet<>(Arrays.asList(mimeTypes)); List<T> filteredExtRepositoryObjects = new ArrayList<>(); for (T extRepositoryObject : extRepositoryObjects) { if (extRepositoryObject instanceof ExtRepositoryFileEntryAdapter) { ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter = (ExtRepositoryFileEntryAdapter)extRepositoryObject; if (allowedMimeTypes.contains( extRepositoryFileEntryAdapter.getMimeType())) { filteredExtRepositoryObjects.add(extRepositoryObject); } } } return filteredExtRepositoryObjects; } private void _forceGetFileVersions( ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter) { extRepositoryFileEntryAdapter.getFileVersions( WorkflowConstants.STATUS_ANY); } private String _getExtRepositoryObjectKey(String uuid) throws PortalException { RepositoryEntry repositoryEntry = repositoryEntryLocalService.fetchRepositoryEntryByUuidAndGroupId( uuid, getGroupId()); if (repositoryEntry == null) { throw new NoSuchRepositoryEntryException( "No repository entry exits with UUID " + uuid); } return repositoryEntry.getMappedId(); } private String _getLogin() { String login = PrincipalThreadLocal.getName(); if (Validator.isNull(login) || _isDefaultUser(login)) { return PropsUtil.get(PropsKeys.DL_REPOSITORY_GUEST_USERNAME); } try { String authType = getAuthType(); if (!authType.equals(CompanyConstants.AUTH_TYPE_ID)) { User user = userLocalService.getUser(GetterUtil.getLong(login)); if (authType.equals(CompanyConstants.AUTH_TYPE_EA)) { login = user.getEmailAddress(); } else if (authType.equals(CompanyConstants.AUTH_TYPE_SN)) { login = user.getScreenName(); } } } catch (PortalException | SystemException e) { if (_log.isWarnEnabled()) { _log.warn( "Unable to get login to connect to external repository " + _extRepository, e); } login = null; } return login; } private String _getPassword() { String login = PrincipalThreadLocal.getName(); if (Validator.isNull(login) || _isDefaultUser(login)) { return PropsUtil.get(PropsKeys.DL_REPOSITORY_GUEST_PASSWORD); } return PrincipalThreadLocal.getPassword(); } private RepositoryEntry _getRootRepositoryEntry(DLFolder rootMountFolder) throws PortalException { return repositoryEntryLocalService.getRepositoryEntry( rootMountFolder.getUserId(), getGroupId(), getRepositoryId(), _extRepository.getRootFolderKey()); } private boolean _isDefaultUser(String login) { User defaultUser = _fetchDefaultUser(); if ((defaultUser != null) && login.equals(defaultUser.getScreenName())) { return true; } return false; } private <T, V extends T> List<T> _sublist( List<V> list, int start, int end, OrderByComparator<T> obc) { if (obc != null) { list = ListUtil.sort(list, obc); } return (List<T>)ListUtil.toList(ListUtil.subList(list, start, end)); } private ExtRepositoryFileVersionAdapter _toExtRepositoryFileVersionAdapter( ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter, ExtRepositoryFileVersion extRepositoryFileVersion) throws PortalException { ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance(); String extRepositoryModelKey = extRepositoryFileVersion.getExtRepositoryModelKey(); ExtRepositoryFileVersionAdapter extRepositoryVersionAdapter = extRepositoryAdapterCache.get(extRepositoryModelKey); if (extRepositoryVersionAdapter == null) { RepositoryEntry repositoryEntry = getRepositoryEntry( extRepositoryModelKey); extRepositoryVersionAdapter = new ExtRepositoryFileVersionAdapter( this, repositoryEntry.getRepositoryEntryId(), repositoryEntry.getUuid(), extRepositoryFileEntryAdapter, extRepositoryFileVersion); extRepositoryAdapterCache.put(extRepositoryVersionAdapter); } return extRepositoryVersionAdapter; } private List<ExtRepositoryFileVersionAdapter> _toExtRepositoryFileVersionAdapters( ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter, List<ExtRepositoryFileVersion> extRepositoryFileVersions) throws PortalException { List<ExtRepositoryFileVersionAdapter> extRepositoryFileVersionAdapters = new ArrayList<>(); for (ExtRepositoryFileVersion extRepositoryFileVersion : extRepositoryFileVersions) { ExtRepositoryFileVersionAdapter extRepositoryFileVersionAdapter = _toExtRepositoryFileVersionAdapter( extRepositoryFileEntryAdapter, extRepositoryFileVersion); extRepositoryFileVersionAdapters.add( extRepositoryFileVersionAdapter); } return extRepositoryFileVersionAdapters; } @SuppressWarnings("unchecked") private <T extends ExtRepositoryObjectAdapter<?>> T _toExtRepositoryObjectAdapter( ExtRepositoryObjectAdapterType<T> extRepositoryObjectAdapterType, ExtRepositoryObject extRepositoryObject) throws PortalException { ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance(); String extRepositoryModelKey = extRepositoryObject.getExtRepositoryModelKey(); ExtRepositoryObjectAdapter<?> extRepositoryObjectAdapter = extRepositoryAdapterCache.get(extRepositoryModelKey); if (extRepositoryObjectAdapter == null) { RepositoryEntry repositoryEntry = getRepositoryEntry( extRepositoryModelKey); if (extRepositoryObject instanceof ExtRepositoryFolder) { ExtRepositoryFolder extRepositoryFolder = (ExtRepositoryFolder)extRepositoryObject; extRepositoryObjectAdapter = new ExtRepositoryFolderAdapter( this, repositoryEntry.getRepositoryEntryId(), repositoryEntry.getUuid(), extRepositoryFolder); } else { ExtRepositoryFileEntry extRepositoryFileEntry = (ExtRepositoryFileEntry)extRepositoryObject; extRepositoryObjectAdapter = new ExtRepositoryFileEntryAdapter( this, repositoryEntry.getRepositoryEntryId(), repositoryEntry.getUuid(), extRepositoryFileEntry); _forceGetFileVersions( (ExtRepositoryFileEntryAdapter)extRepositoryObjectAdapter); _checkAssetEntry( (ExtRepositoryFileEntryAdapter)extRepositoryObjectAdapter); } extRepositoryAdapterCache.put(extRepositoryObjectAdapter); } if (extRepositoryObjectAdapterType == ExtRepositoryObjectAdapterType.FILE) { if (!(extRepositoryObjectAdapter instanceof ExtRepositoryFileEntryAdapter)) { throw new NoSuchFileEntryException( "External repository object is not a file " + extRepositoryObject); } } else if (extRepositoryObjectAdapterType == ExtRepositoryObjectAdapterType.FOLDER) { if (!(extRepositoryObjectAdapter instanceof ExtRepositoryFolderAdapter)) { throw new NoSuchFolderException( "External repository object is not a folder " + extRepositoryObject); } } else if (extRepositoryObjectAdapterType != ExtRepositoryObjectAdapterType.OBJECT) { throw new IllegalArgumentException( "Unsupported repository object type " + extRepositoryObjectAdapterType); } return (T)extRepositoryObjectAdapter; } private <T extends ExtRepositoryObjectAdapter<?>> List<T> _toExtRepositoryObjectAdapters( ExtRepositoryObjectAdapterType<T> extRepositoryObjectAdapterType, List<? extends ExtRepositoryObject> extRepositoryObjects) throws PortalException { List<T> extRepositoryObjectAdapters = new ArrayList<>(); for (ExtRepositoryObject extRepositoryObject : extRepositoryObjects) { extRepositoryObjectAdapters.add( _toExtRepositoryObjectAdapter( extRepositoryObjectAdapterType, extRepositoryObject)); } return extRepositoryObjectAdapters; } private static final Log _log = LogFactoryUtil.getLog( ExtRepositoryAdapter.class); private final ExtRepository _extRepository; }