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