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                    boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
080    
081                    try {
082                            DLAppHelperThreadLocal.setEnabled(false);
083    
084                            TemporaryFileEntriesCapability temporaryFileEntriesCapability =
085                                    _getTemporaryFileEntriesCapability(groupId);
086    
087                            return temporaryFileEntriesCapability.addTemporaryFileEntry(
088                                    new TemporaryFileEntriesScope(_UUID, userId, folderName),
089                                    fileName, mimeType, inputStream);
090                    }
091                    finally {
092                            DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
093                    }
094            }
095    
096            public static void deleteTempFileEntry(long fileEntryId)
097                    throws PortalException {
098    
099                    LocalRepository localRepository =
100                            RepositoryProviderUtil.getFileEntryLocalRepository(fileEntryId);
101    
102                    FileEntry fileEntry = localRepository.getFileEntry(fileEntryId);
103    
104                    Folder folder = fileEntry.getFolder();
105    
106                    deleteTempFileEntry(
107                            fileEntry.getGroupId(), fileEntry.getUserId(), folder.getName(),
108                            fileEntry.getTitle());
109            }
110    
111            public static void deleteTempFileEntry(
112                            long groupId, long userId, String folderName, String fileName)
113                    throws PortalException {
114    
115                    boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
116    
117                    try {
118                            DLAppHelperThreadLocal.setEnabled(false);
119    
120                            TemporaryFileEntriesCapability temporaryFileEntriesCapability =
121                                    _getTemporaryFileEntriesCapability(groupId);
122    
123                            temporaryFileEntriesCapability.deleteTemporaryFileEntry(
124                                    new TemporaryFileEntriesScope(_UUID, userId, folderName),
125                                    fileName);
126                    }
127                    finally {
128                            DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
129                    }
130            }
131    
132            public static String getOriginalTempFileName(String tempFileName) {
133                    String extension = FileUtil.getExtension(tempFileName);
134    
135                    int pos = tempFileName.lastIndexOf(TEMP_RANDOM_SUFFIX);
136    
137                    if (pos != -1) {
138                            tempFileName = tempFileName.substring(0, pos);
139    
140                            if (Validator.isNotNull(extension)) {
141                                    tempFileName = tempFileName + StringPool.PERIOD + extension;
142                            }
143                    }
144    
145                    return tempFileName;
146            }
147    
148            public static FileEntry getTempFileEntry(
149                            long groupId, long userId, String folderName, String fileName)
150                    throws PortalException {
151    
152                    TemporaryFileEntriesCapability temporaryFileEntriesCapability =
153                            _getTemporaryFileEntriesCapability(groupId);
154    
155                    return temporaryFileEntriesCapability.getTemporaryFileEntry(
156                            new TemporaryFileEntriesScope(_UUID, userId, folderName), fileName);
157            }
158    
159            public static String getTempFileName(String originalFileName) {
160                    StringBundler sb = new StringBundler(5);
161    
162                    sb.append(FileUtil.stripExtension(originalFileName));
163                    sb.append(TEMP_RANDOM_SUFFIX);
164                    sb.append(StringUtil.randomString());
165    
166                    String extension = FileUtil.getExtension(originalFileName);
167    
168                    if (Validator.isNotNull(extension)) {
169                            sb.append(StringPool.PERIOD);
170                            sb.append(extension);
171                    }
172    
173                    return sb.toString();
174            }
175    
176            public static String[] getTempFileNames(
177                            long groupId, long userId, String folderName)
178                    throws PortalException {
179    
180                    TemporaryFileEntriesCapability temporaryFileEntriesCapability =
181                            _getTemporaryFileEntriesCapability(groupId);
182    
183                    List<FileEntry> fileEntries =
184                            temporaryFileEntriesCapability.getTemporaryFileEntries(
185                                    new TemporaryFileEntriesScope(_UUID, userId, folderName));
186    
187                    List<String> fileNames = new ArrayList<>();
188    
189                    for (FileEntry fileEntry : fileEntries) {
190                            fileNames.add(fileEntry.getFileName());
191                    }
192    
193                    return ArrayUtil.toStringArray(fileNames);
194            }
195    
196            private static LocalRepository _addPortletRepository(
197                            long groupId, ServiceContext serviceContext)
198                    throws PortalException {
199    
200                    Repository repository = RepositoryLocalServiceUtil.fetchRepository(
201                            groupId, TempFileEntryUtil.class.getName(), StringPool.BLANK);
202    
203                    if (repository != null) {
204                            return RepositoryProviderUtil.getLocalRepository(
205                                    repository.getRepositoryId());
206                    }
207    
208                    Group group = GroupLocalServiceUtil.getGroup(groupId);
209    
210                    User user = UserLocalServiceUtil.getDefaultUser(group.getCompanyId());
211    
212                    long classNameId = PortalUtil.getClassNameId(
213                            "com.liferay.portal.repository.temporaryrepository." +
214                                    "TemporaryFileEntryRepository");
215    
216                    UnicodeProperties typeSettingsProperties = new UnicodeProperties();
217    
218                    boolean dlAppHelperEnabled = DLAppHelperThreadLocal.isEnabled();
219    
220                    try {
221                            DLAppHelperThreadLocal.setEnabled(false);
222    
223                            repository = RepositoryLocalServiceUtil.addRepository(
224                                    user.getUserId(), groupId, classNameId,
225                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
226                                    TempFileEntryUtil.class.getName(), StringPool.BLANK,
227                                    StringPool.BLANK, typeSettingsProperties, true, serviceContext);
228    
229                            return RepositoryProviderUtil.getLocalRepository(
230                                    repository.getRepositoryId());
231                    }
232                    finally {
233                            DLAppHelperThreadLocal.setEnabled(dlAppHelperEnabled);
234                    }
235            }
236    
237            private static TemporaryFileEntriesCapability
238                            _getTemporaryFileEntriesCapability(long groupId)
239                    throws PortalException {
240    
241                    ServiceContext serviceContext = new ServiceContext();
242    
243                    serviceContext.setAddGroupPermissions(true);
244                    serviceContext.setAddGuestPermissions(true);
245    
246                    LocalRepository localRepository = _addPortletRepository(
247                            groupId, serviceContext);
248    
249                    return localRepository.getCapability(
250                            TemporaryFileEntriesCapability.class);
251            }
252    
253            private static final UUID _UUID = UUID.fromString(
254                    "00EF1134-B3EE-432A-BABD-367CEFA44DE1");
255    
256    }