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.portal.kernel.util;
016    
017    import com.liferay.document.library.kernel.model.DLFolderConstants;
018    import com.liferay.document.library.kernel.util.DLAppHelperThreadLocal;
019    import com.liferay.portal.kernel.exception.PortalException;
020    import com.liferay.portal.kernel.model.Group;
021    import com.liferay.portal.kernel.model.Repository;
022    import com.liferay.portal.kernel.model.User;
023    import com.liferay.portal.kernel.repository.LocalRepository;
024    import com.liferay.portal.kernel.repository.RepositoryProviderUtil;
025    import com.liferay.portal.kernel.repository.capabilities.TemporaryFileEntriesCapability;
026    import com.liferay.portal.kernel.repository.capabilities.TemporaryFileEntriesScope;
027    import com.liferay.portal.kernel.repository.model.FileEntry;
028    import com.liferay.portal.kernel.repository.model.Folder;
029    import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
030    import com.liferay.portal.kernel.service.RepositoryLocalServiceUtil;
031    import com.liferay.portal.kernel.service.ServiceContext;
032    import com.liferay.portal.kernel.service.UserLocalServiceUtil;
033    
034    import java.io.File;
035    import java.io.FileInputStream;
036    import java.io.FileNotFoundException;
037    import java.io.InputStream;
038    
039    import java.util.ArrayList;
040    import java.util.List;
041    import java.util.UUID;
042    
043    /**
044     * @author Sergio González
045     * @author Matthew Kong
046     * @author Alexander Chow
047     * @author Iván Zaera
048     */
049    public class TempFileEntryUtil {
050    
051            public static final String TEMP_RANDOM_SUFFIX = "--tempRandomSuffix--";
052    
053            public static FileEntry addTempFileEntry(
054                            long groupId, long userId, String folderName, String fileName,
055                            File file, String mimeType)
056                    throws PortalException {
057    
058                    InputStream inputStream = null;
059    
060                    try {
061                            inputStream = new FileInputStream(file);
062    
063                            return addTempFileEntry(
064                                    groupId, userId, folderName, fileName, inputStream, mimeType);
065                    }
066                    catch (FileNotFoundException fnfe) {
067                            throw new PortalException(fnfe);
068                    }
069                    finally {
070                            StreamUtil.cleanUp(inputStream);
071                    }
072            }
073    
074            public static FileEntry addTempFileEntry(
075                            long groupId, long userId, String folderName, String fileName,
076                            InputStream inputStream, String mimeType)
077                    throws PortalException {
078    
079                    TemporaryFileEntriesCapability temporaryFileEntriesCapability =
080                            _getTemporaryFileEntriesCapability(groupId);
081    
082                    return temporaryFileEntriesCapability.addTemporaryFileEntry(
083                            new TemporaryFileEntriesScope(_UUID, userId, folderName), fileName,
084                            mimeType, inputStream);
085            }
086    
087            public static void deleteTempFileEntry(long fileEntryId)
088                    throws PortalException {
089    
090                    LocalRepository localRepository =
091                            RepositoryProviderUtil.getFileEntryLocalRepository(fileEntryId);
092    
093                    FileEntry fileEntry = localRepository.getFileEntry(fileEntryId);
094    
095                    Folder folder = fileEntry.getFolder();
096    
097                    deleteTempFileEntry(
098                            fileEntry.getGroupId(), fileEntry.getUserId(), folder.getName(),
099                            fileEntry.getTitle());
100            }
101    
102            public static void deleteTempFileEntry(
103                            long groupId, long userId, String folderName, String fileName)
104                    throws PortalException {
105    
106                    TemporaryFileEntriesCapability temporaryFileEntriesCapability =
107                            _getTemporaryFileEntriesCapability(groupId);
108    
109                    temporaryFileEntriesCapability.deleteTemporaryFileEntry(
110                            new TemporaryFileEntriesScope(_UUID, userId, folderName), fileName);
111            }
112    
113            public static String getOriginalTempFileName(String tempFileName) {
114                    String extension = FileUtil.getExtension(tempFileName);
115    
116                    int pos = tempFileName.lastIndexOf(TEMP_RANDOM_SUFFIX);
117    
118                    if (pos != -1) {
119                            tempFileName = tempFileName.substring(0, pos);
120    
121                            if (Validator.isNotNull(extension)) {
122                                    tempFileName = tempFileName + StringPool.PERIOD + extension;
123                            }
124                    }
125    
126                    return tempFileName;
127            }
128    
129            public static FileEntry getTempFileEntry(
130                            long groupId, long userId, String folderName, String fileName)
131                    throws PortalException {
132    
133                    TemporaryFileEntriesCapability temporaryFileEntriesCapability =
134                            _getTemporaryFileEntriesCapability(groupId);
135    
136                    return temporaryFileEntriesCapability.getTemporaryFileEntry(
137                            new TemporaryFileEntriesScope(_UUID, userId, folderName), fileName);
138            }
139    
140            public static String getTempFileName(String originalFileName) {
141                    StringBundler sb = new StringBundler(5);
142    
143                    sb.append(FileUtil.stripExtension(originalFileName));
144                    sb.append(TEMP_RANDOM_SUFFIX);
145                    sb.append(StringUtil.randomString());
146    
147                    String extension = FileUtil.getExtension(originalFileName);
148    
149                    if (Validator.isNotNull(extension)) {
150                            sb.append(StringPool.PERIOD);
151                            sb.append(extension);
152                    }
153    
154                    return sb.toString();
155            }
156    
157            public static String[] getTempFileNames(
158                            long groupId, long userId, String folderName)
159                    throws PortalException {
160    
161                    TemporaryFileEntriesCapability temporaryFileEntriesCapability =
162                            _getTemporaryFileEntriesCapability(groupId);
163    
164                    List<FileEntry> fileEntries =
165                            temporaryFileEntriesCapability.getTemporaryFileEntries(
166                                    new TemporaryFileEntriesScope(_UUID, userId, folderName));
167    
168                    List<String> fileNames = new ArrayList<>();
169    
170                    for (FileEntry fileEntry : fileEntries) {
171                            fileNames.add(fileEntry.getFileName());
172                    }
173    
174                    return ArrayUtil.toStringArray(fileNames);
175            }
176    
177            private static LocalRepository _addPortletRepository(
178                            long groupId, ServiceContext serviceContext)
179                    throws PortalException {
180    
181                    Repository repository = RepositoryLocalServiceUtil.fetchRepository(
182                            groupId, TempFileEntryUtil.class.getName(), StringPool.BLANK);
183    
184                    if (repository != null) {
185                            return RepositoryProviderUtil.getLocalRepository(
186                                    repository.getRepositoryId());
187                    }
188    
189                    Group group = GroupLocalServiceUtil.getGroup(groupId);
190    
191                    User user = UserLocalServiceUtil.getDefaultUser(group.getCompanyId());
192    
193                    long classNameId = PortalUtil.getClassNameId(
194                            "com.liferay.portal.repository.temporaryrepository." +
195                                    "TemporaryFileEntryRepository");
196    
197                    UnicodeProperties typeSettingsProperties = new UnicodeProperties();
198    
199                    boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
200    
201                    try {
202                            DLAppHelperThreadLocal.setEnabled(false);
203    
204                            repository = RepositoryLocalServiceUtil.addRepository(
205                                    user.getUserId(), groupId, classNameId,
206                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
207                                    TempFileEntryUtil.class.getName(), StringPool.BLANK,
208                                    StringPool.BLANK, typeSettingsProperties, true, serviceContext);
209    
210                            return RepositoryProviderUtil.getLocalRepository(
211                                    repository.getRepositoryId());
212                    }
213                    finally {
214                            DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
215                    }
216            }
217    
218            private static TemporaryFileEntriesCapability
219                            _getTemporaryFileEntriesCapability(long groupId)
220                    throws PortalException {
221    
222                    ServiceContext serviceContext = new ServiceContext();
223    
224                    serviceContext.setAddGroupPermissions(true);
225                    serviceContext.setAddGuestPermissions(true);
226    
227                    LocalRepository localRepository = _addPortletRepository(
228                            groupId, serviceContext);
229    
230                    return localRepository.getCapability(
231                            TemporaryFileEntriesCapability.class);
232            }
233    
234            private static final UUID _UUID = UUID.fromString(
235                    "00EF1134-B3EE-432A-BABD-367CEFA44DE1");
236    
237    }