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.service.impl;
016    
017    import com.liferay.portal.InvalidRepositoryException;
018    import com.liferay.portal.NoSuchRepositoryException;
019    import com.liferay.portal.kernel.bean.BeanReference;
020    import com.liferay.portal.kernel.exception.PortalException;
021    import com.liferay.portal.kernel.log.Log;
022    import com.liferay.portal.kernel.log.LogFactoryUtil;
023    import com.liferay.portal.kernel.repository.InvalidRepositoryIdException;
024    import com.liferay.portal.kernel.repository.RepositoryFactoryUtil;
025    import com.liferay.portal.kernel.repository.RepositoryProvider;
026    import com.liferay.portal.kernel.systemevent.SystemEvent;
027    import com.liferay.portal.kernel.util.UnicodeProperties;
028    import com.liferay.portal.kernel.util.Validator;
029    import com.liferay.portal.model.Group;
030    import com.liferay.portal.model.Repository;
031    import com.liferay.portal.model.RepositoryEntry;
032    import com.liferay.portal.model.SystemEventConstants;
033    import com.liferay.portal.model.User;
034    import com.liferay.portal.service.ServiceContext;
035    import com.liferay.portal.service.base.RepositoryLocalServiceBaseImpl;
036    import com.liferay.portal.util.RepositoryUtil;
037    import com.liferay.portlet.documentlibrary.RepositoryNameException;
038    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
039    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
040    import com.liferay.portlet.documentlibrary.model.DLFileVersion;
041    import com.liferay.portlet.documentlibrary.model.DLFolder;
042    
043    import java.util.List;
044    
045    /**
046     * @author Alexander Chow
047     */
048    public class RepositoryLocalServiceImpl extends RepositoryLocalServiceBaseImpl {
049    
050            @Override
051            public Repository addRepository(
052                            long userId, long groupId, long classNameId, long parentFolderId,
053                            String name, String description, String portletId,
054                            UnicodeProperties typeSettingsProperties, boolean hidden,
055                            ServiceContext serviceContext)
056                    throws PortalException {
057    
058                    User user = userPersistence.findByPrimaryKey(userId);
059    
060                    long repositoryId = counterLocalService.increment();
061    
062                    Repository repository = repositoryPersistence.create(repositoryId);
063    
064                    repository.setUuid(serviceContext.getUuid());
065                    repository.setGroupId(groupId);
066                    repository.setCompanyId(user.getCompanyId());
067                    repository.setUserId(user.getUserId());
068                    repository.setUserName(user.getFullName());
069                    repository.setClassNameId(classNameId);
070                    repository.setName(name);
071                    repository.setDescription(description);
072                    repository.setPortletId(portletId);
073                    repository.setTypeSettingsProperties(typeSettingsProperties);
074                    repository.setDlFolderId(
075                            getDLFolderId(
076                                    user, groupId, repositoryId, parentFolderId, name, description,
077                                    hidden, serviceContext));
078    
079                    repositoryPersistence.update(repository);
080    
081                    try {
082                            RepositoryFactoryUtil.createRepository(repositoryId);
083                    }
084                    catch (Exception e) {
085                            if (_log.isWarnEnabled()) {
086                                    _log.warn(e, e);
087                            }
088    
089                            throw new InvalidRepositoryException(e);
090                    }
091    
092                    return repository;
093            }
094    
095            /**
096             * @deprecated As of 6.2.0, replaced by {@link #addRepository(long, long,
097             *             long, long, String, String, String, UnicodeProperties,
098             *             boolean, ServiceContext)}
099             */
100            @Deprecated
101            @Override
102            public Repository addRepository(
103                            long userId, long groupId, long classNameId, long parentFolderId,
104                            String name, String description, String portletId,
105                            UnicodeProperties typeSettingsProperties,
106                            ServiceContext serviceContext)
107                    throws PortalException {
108    
109                    return addRepository(
110                            userId, groupId, classNameId, parentFolderId, name, description,
111                            portletId, typeSettingsProperties, false, serviceContext);
112            }
113    
114            @Override
115            public void checkRepository(long repositoryId) {
116                    Group group = groupPersistence.fetchByPrimaryKey(repositoryId);
117    
118                    if (group != null) {
119                            return;
120                    }
121    
122                    try {
123                            repositoryPersistence.findByPrimaryKey(repositoryId);
124                    }
125                    catch (NoSuchRepositoryException nsre) {
126                            throw new InvalidRepositoryIdException(nsre.getMessage());
127                    }
128            }
129    
130            @Override
131            public void deleteRepositories(long groupId) {
132                    List<Repository> repositories = repositoryPersistence.findByGroupId(
133                            groupId);
134    
135                    for (Repository repository : repositories) {
136                            deleteRepository(repository.getRepositoryId());
137                    }
138            }
139    
140            @Override
141            public Repository deleteRepository(long repositoryId) {
142                    Repository repository = repositoryPersistence.fetchByPrimaryKey(
143                            repositoryId);
144    
145                    if (repository != null) {
146                            repositoryLocalService.deleteRepository(repository);
147                    }
148    
149                    repositoryProvider.invalidateRepository(repositoryId);
150    
151                    return repository;
152            }
153    
154            @Override
155            @SystemEvent(
156                    action = SystemEventConstants.ACTION_SKIP,
157                    type = SystemEventConstants.TYPE_DELETE
158            )
159            public Repository deleteRepository(Repository repository) {
160                    expandoValueLocalService.deleteValues(
161                            Repository.class.getName(), repository.getRepositoryId());
162    
163                    DLFolder dlFolder = dlFolderLocalService.fetchDLFolder(
164                            repository.getDlFolderId());
165    
166                    if (dlFolder != null) {
167                            dlFolderLocalService.deleteDLFolder(dlFolder);
168                    }
169    
170                    repositoryPersistence.remove(repository);
171    
172                    repositoryEntryPersistence.removeByRepositoryId(
173                            repository.getRepositoryId());
174    
175                    return repository;
176            }
177    
178            @Override
179            public Repository fetchRepository(long groupId, String portletId) {
180                    return fetchRepository(groupId, portletId, portletId);
181            }
182    
183            @Override
184            public Repository fetchRepository(
185                    long groupId, String name, String portletId) {
186    
187                    return repositoryPersistence.fetchByG_N_P(groupId, name, portletId);
188            }
189    
190            @Override
191            public List<Repository> getGroupRepositories(long groupId) {
192                    return repositoryPersistence.findByGroupId(groupId);
193            }
194    
195            @Override
196            public Repository getRepository(long groupId, String portletId)
197                    throws PortalException {
198    
199                    return getRepository(groupId, portletId, portletId);
200            }
201    
202            @Override
203            public Repository getRepository(long groupId, String name, String portletId)
204                    throws PortalException {
205    
206                    return repositoryPersistence.findByG_N_P(groupId, name, portletId);
207            }
208    
209            @Override
210            public UnicodeProperties getTypeSettingsProperties(long repositoryId)
211                    throws PortalException {
212    
213                    Repository repository = repositoryPersistence.findByPrimaryKey(
214                            repositoryId);
215    
216                    return repository.getTypeSettingsProperties();
217            }
218    
219            @Override
220            public void updateRepository(
221                            long repositoryId, String name, String description)
222                    throws PortalException {
223    
224                    Repository repository = repositoryPersistence.findByPrimaryKey(
225                            repositoryId);
226    
227                    repository.setName(name);
228                    repository.setDescription(description);
229    
230                    repositoryPersistence.update(repository);
231    
232                    DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(
233                            repository.getDlFolderId());
234    
235                    dlFolder.setName(name);
236                    dlFolder.setDescription(description);
237    
238                    dlFolderPersistence.update(dlFolder);
239            }
240    
241            @Override
242            public void updateRepository(
243                            long repositoryId, UnicodeProperties typeSettingsProperties)
244                    throws PortalException {
245    
246                    Repository repository = repositoryPersistence.findByPrimaryKey(
247                            repositoryId);
248    
249                    repository.setTypeSettingsProperties(typeSettingsProperties);
250    
251                    repositoryPersistence.update(repository);
252            }
253    
254            protected long getDLFolderId(
255                            User user, long groupId, long repositoryId, long parentFolderId,
256                            String name, String description, boolean hidden,
257                            ServiceContext serviceContext)
258                    throws PortalException {
259    
260                    if (Validator.isNull(name)) {
261                            throw new RepositoryNameException();
262                    }
263    
264                    DLFolder dlFolder = dlFolderLocalService.addFolder(
265                            user.getUserId(), groupId, repositoryId, true, parentFolderId, name,
266                            description, hidden, serviceContext);
267    
268                    return dlFolder.getFolderId();
269            }
270    
271            protected long getExternalRepositoryId(
272                    long folderId, long fileEntryId, long fileVersionId) {
273    
274                    long repositoryEntryId = RepositoryUtil.getRepositoryEntryId(
275                            folderId, fileEntryId, fileVersionId);
276    
277                    RepositoryEntry repositoryEntry =
278                            repositoryEntryLocalService.fetchRepositoryEntry(repositoryEntryId);
279    
280                    if (repositoryEntry == null) {
281                            return 0;
282                    }
283    
284                    return repositoryEntry.getRepositoryId();
285            }
286    
287            protected long getInternalRepositoryId(
288                    long folderId, long fileEntryId, long fileVersionId,
289                    long fileShortcutId) {
290    
291                    long repositoryId = 0;
292    
293                    if (folderId != 0) {
294                            DLFolder dlFolder = dlFolderLocalService.fetchDLFolder(folderId);
295    
296                            if (dlFolder != null) {
297                                    if (dlFolder.isMountPoint()) {
298                                            repositoryId = dlFolder.getGroupId();
299                                    }
300                                    else {
301                                            repositoryId = dlFolder.getRepositoryId();
302                                    }
303                            }
304                    }
305                    else if (fileEntryId != 0) {
306                            DLFileEntry dlFileEntry = dlFileEntryLocalService.fetchDLFileEntry(
307                                    fileEntryId);
308    
309                            if (dlFileEntry != null) {
310                                    repositoryId = dlFileEntry.getRepositoryId();
311                            }
312                    }
313                    else if (fileVersionId != 0) {
314                            DLFileVersion dlFileVersion =
315                                    dlFileVersionLocalService.fetchDLFileVersion(fileVersionId);
316    
317                            if (dlFileVersion != null) {
318                                    repositoryId = dlFileVersion.getRepositoryId();
319                            }
320                    }
321                    else if (fileShortcutId != 0) {
322                            DLFileShortcut dlFileShortcut =
323                                    dlFileShortcutLocalService.fetchDLFileShortcut(fileShortcutId);
324    
325                            if (dlFileShortcut != null) {
326                                    repositoryId = dlFileShortcut.getRepositoryId();
327                            }
328                    }
329                    else {
330                            throw new InvalidRepositoryIdException(
331                                    "Missing a valid ID for folder, file entry, or file " +
332                                            "version");
333                    }
334    
335                    return repositoryId;
336            }
337    
338            protected long getRepositoryId(
339                    long folderId, long fileEntryId, long fileVersionId,
340                    long fileShortcutId) {
341    
342                    long repositoryId = getInternalRepositoryId(
343                            folderId, fileEntryId, fileVersionId, fileShortcutId);
344    
345                    if (repositoryId != 0) {
346                            return repositoryId;
347                    }
348    
349                    if (fileShortcutId != 0) {
350                            throw new IllegalArgumentException();
351                    }
352    
353                    repositoryId = getExternalRepositoryId(
354                            folderId, fileEntryId, fileVersionId);
355    
356                    if (repositoryId == 0) {
357                            throw new InvalidRepositoryIdException(
358                                    String.format(
359                                            "No folder or repository entry found with folder ID %s",
360                                            folderId));
361                    }
362    
363                    return repositoryId;
364            }
365    
366            @BeanReference(type = RepositoryProvider.class)
367            protected RepositoryProvider repositoryProvider;
368    
369            private static final Log _log = LogFactoryUtil.getLog(
370                    RepositoryLocalServiceImpl.class);
371    
372    }