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