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.document.library.kernel.exception.RepositoryNameException;
018    import com.liferay.document.library.kernel.model.DLFolder;
019    import com.liferay.portal.kernel.bean.BeanReference;
020    import com.liferay.portal.kernel.exception.InvalidRepositoryException;
021    import com.liferay.portal.kernel.exception.NoSuchRepositoryException;
022    import com.liferay.portal.kernel.exception.PortalException;
023    import com.liferay.portal.kernel.log.Log;
024    import com.liferay.portal.kernel.log.LogFactoryUtil;
025    import com.liferay.portal.kernel.model.Group;
026    import com.liferay.portal.kernel.model.Repository;
027    import com.liferay.portal.kernel.model.SystemEventConstants;
028    import com.liferay.portal.kernel.model.User;
029    import com.liferay.portal.kernel.repository.InvalidRepositoryIdException;
030    import com.liferay.portal.kernel.repository.LocalRepository;
031    import com.liferay.portal.kernel.repository.RepositoryFactoryUtil;
032    import com.liferay.portal.kernel.repository.RepositoryProvider;
033    import com.liferay.portal.kernel.repository.UndeployedExternalRepositoryException;
034    import com.liferay.portal.kernel.repository.capabilities.RepositoryEventTriggerCapability;
035    import com.liferay.portal.kernel.repository.event.RepositoryEventType;
036    import com.liferay.portal.kernel.service.ServiceContext;
037    import com.liferay.portal.kernel.systemevent.SystemEvent;
038    import com.liferay.portal.kernel.util.UnicodeProperties;
039    import com.liferay.portal.kernel.util.Validator;
040    import com.liferay.portal.service.base.RepositoryLocalServiceBaseImpl;
041    
042    import java.util.List;
043    
044    /**
045     * @author Alexander Chow
046     */
047    public class RepositoryLocalServiceImpl extends RepositoryLocalServiceBaseImpl {
048    
049            @Override
050            public Repository addRepository(
051                            long userId, long groupId, long classNameId, long parentFolderId,
052                            String name, String description, String portletId,
053                            UnicodeProperties typeSettingsProperties, boolean hidden,
054                            ServiceContext serviceContext)
055                    throws PortalException {
056    
057                    User user = userPersistence.findByPrimaryKey(userId);
058    
059                    long repositoryId = counterLocalService.increment();
060    
061                    Repository repository = repositoryPersistence.create(repositoryId);
062    
063                    repository.setUuid(serviceContext.getUuid());
064                    repository.setGroupId(groupId);
065                    repository.setCompanyId(user.getCompanyId());
066                    repository.setUserId(user.getUserId());
067                    repository.setUserName(user.getFullName());
068                    repository.setClassNameId(classNameId);
069                    repository.setName(name);
070                    repository.setDescription(description);
071                    repository.setPortletId(portletId);
072                    repository.setTypeSettingsProperties(typeSettingsProperties);
073                    repository.setDlFolderId(
074                            getDLFolderId(
075                                    user, groupId, repositoryId, parentFolderId, name, description,
076                                    hidden, serviceContext));
077    
078                    repositoryPersistence.update(repository);
079    
080                    try {
081                            RepositoryFactoryUtil.createRepository(repositoryId);
082                    }
083                    catch (Exception e) {
084                            if (_log.isWarnEnabled()) {
085                                    _log.warn(e, e);
086                            }
087    
088                            throw new InvalidRepositoryException(e);
089                    }
090    
091                    return repository;
092            }
093    
094            @Override
095            public void checkRepository(long repositoryId) {
096                    Group group = groupPersistence.fetchByPrimaryKey(repositoryId);
097    
098                    if (group != null) {
099                            return;
100                    }
101    
102                    try {
103                            repositoryPersistence.findByPrimaryKey(repositoryId);
104                    }
105                    catch (NoSuchRepositoryException nsre) {
106                            throw new InvalidRepositoryIdException(nsre.getMessage());
107                    }
108            }
109    
110            @Override
111            public void deleteRepositories(long groupId) throws PortalException {
112                    List<Repository> repositories = repositoryPersistence.findByGroupId(
113                            groupId);
114    
115                    for (Repository repository : repositories) {
116                            deleteRepository(repository.getRepositoryId());
117                    }
118            }
119    
120            @Override
121            public Repository deleteRepository(long repositoryId)
122                    throws PortalException {
123    
124                    Repository repository = repositoryPersistence.fetchByPrimaryKey(
125                            repositoryId);
126    
127                    if (repository == null) {
128                            return null;
129                    }
130    
131                    try {
132                            LocalRepository localRepository =
133                                    repositoryProvider.getLocalRepository(repositoryId);
134    
135                            if (localRepository.isCapabilityProvided(
136                                            RepositoryEventTriggerCapability.class)) {
137    
138                                    RepositoryEventTriggerCapability
139                                            repositoryEventTriggerCapability =
140                                                    localRepository.getCapability(
141                                                            RepositoryEventTriggerCapability.class);
142    
143                                    repositoryEventTriggerCapability.trigger(
144                                            RepositoryEventType.Delete.class, LocalRepository.class,
145                                            localRepository);
146                            }
147                    }
148                    catch (UndeployedExternalRepositoryException uere) {
149                            if (_log.isWarnEnabled()) {
150                                    _log.warn(
151                                            "Repository deletion events for this repository will not " +
152                                                    "be triggered",
153                                            uere);
154                            }
155                    }
156    
157                    return repositoryLocalService.deleteRepository(repository);
158            }
159    
160            @Override
161            @SystemEvent(
162                    action = SystemEventConstants.ACTION_SKIP,
163                    type = SystemEventConstants.TYPE_DELETE
164            )
165            public Repository deleteRepository(Repository repository) {
166                    expandoValueLocalService.deleteValues(
167                            Repository.class.getName(), repository.getRepositoryId());
168    
169                    DLFolder dlFolder = dlFolderLocalService.fetchDLFolder(
170                            repository.getDlFolderId());
171    
172                    if (dlFolder != null) {
173                            dlFolderLocalService.deleteDLFolder(dlFolder);
174                    }
175    
176                    repositoryPersistence.remove(repository);
177    
178                    repositoryEntryPersistence.removeByRepositoryId(
179                            repository.getRepositoryId());
180    
181                    return repository;
182            }
183    
184            @Override
185            public Repository fetchRepository(long groupId, String portletId) {
186                    return fetchRepository(groupId, portletId, portletId);
187            }
188    
189            @Override
190            public Repository fetchRepository(
191                    long groupId, String name, String portletId) {
192    
193                    return repositoryPersistence.fetchByG_N_P(groupId, name, portletId);
194            }
195    
196            @Override
197            public List<Repository> getGroupRepositories(long groupId) {
198                    return repositoryPersistence.findByGroupId(groupId);
199            }
200    
201            @Override
202            public Repository getRepository(long groupId, String portletId)
203                    throws PortalException {
204    
205                    return getRepository(groupId, portletId, portletId);
206            }
207    
208            @Override
209            public Repository getRepository(long groupId, String name, String portletId)
210                    throws PortalException {
211    
212                    return repositoryPersistence.findByG_N_P(groupId, name, portletId);
213            }
214    
215            @Override
216            public UnicodeProperties getTypeSettingsProperties(long repositoryId)
217                    throws PortalException {
218    
219                    Repository repository = repositoryPersistence.findByPrimaryKey(
220                            repositoryId);
221    
222                    return repository.getTypeSettingsProperties();
223            }
224    
225            @Override
226            public void updateRepository(
227                            long repositoryId, String name, String description)
228                    throws PortalException {
229    
230                    Repository repository = repositoryPersistence.findByPrimaryKey(
231                            repositoryId);
232    
233                    repository.setName(name);
234                    repository.setDescription(description);
235    
236                    repositoryPersistence.update(repository);
237    
238                    DLFolder dlFolder = dlFolderPersistence.findByPrimaryKey(
239                            repository.getDlFolderId());
240    
241                    dlFolder.setName(name);
242                    dlFolder.setDescription(description);
243    
244                    dlFolderPersistence.update(dlFolder);
245            }
246    
247            @Override
248            public void updateRepository(
249                            long repositoryId, UnicodeProperties typeSettingsProperties)
250                    throws PortalException {
251    
252                    Repository repository = repositoryPersistence.findByPrimaryKey(
253                            repositoryId);
254    
255                    repository.setTypeSettingsProperties(typeSettingsProperties);
256    
257                    repositoryPersistence.update(repository);
258            }
259    
260            protected long getDLFolderId(
261                            User user, long groupId, long repositoryId, long parentFolderId,
262                            String name, String description, boolean hidden,
263                            ServiceContext serviceContext)
264                    throws PortalException {
265    
266                    if (Validator.isNull(name)) {
267                            throw new RepositoryNameException();
268                    }
269    
270                    DLFolder dlFolder = dlFolderLocalService.addFolder(
271                            user.getUserId(), groupId, repositoryId, true, parentFolderId, name,
272                            description, hidden, serviceContext);
273    
274                    return dlFolder.getFolderId();
275            }
276    
277            @BeanReference(type = RepositoryProvider.class)
278            protected RepositoryProvider repositoryProvider;
279    
280            private static final Log _log = LogFactoryUtil.getLog(
281                    RepositoryLocalServiceImpl.class);
282    
283    }