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