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.portlet.documentlibrary.service.impl;
016    
017    import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
019    import com.liferay.portal.kernel.dao.orm.Property;
020    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
021    import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
022    import com.liferay.portal.kernel.exception.PortalException;
023    import com.liferay.portal.kernel.repository.model.FileEntry;
024    import com.liferay.portal.kernel.systemevent.SystemEvent;
025    import com.liferay.portal.kernel.workflow.WorkflowConstants;
026    import com.liferay.portal.model.ResourceConstants;
027    import com.liferay.portal.model.SystemEventConstants;
028    import com.liferay.portal.model.User;
029    import com.liferay.portal.service.ServiceContext;
030    import com.liferay.portal.service.permission.ModelPermissions;
031    import com.liferay.portlet.documentlibrary.exception.NoSuchFileEntryException;
032    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
033    import com.liferay.portlet.documentlibrary.model.DLFileShortcutConstants;
034    import com.liferay.portlet.documentlibrary.model.DLFolder;
035    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
036    import com.liferay.portlet.documentlibrary.service.base.DLFileShortcutLocalServiceBaseImpl;
037    
038    import java.util.Date;
039    import java.util.List;
040    
041    /**
042     * @author Brian Wing Shun Chan
043     */
044    public class DLFileShortcutLocalServiceImpl
045            extends DLFileShortcutLocalServiceBaseImpl {
046    
047            @Override
048            public DLFileShortcut addFileShortcut(
049                            long userId, long groupId, long repositoryId, long folderId,
050                            long toFileEntryId, ServiceContext serviceContext)
051                    throws PortalException {
052    
053                    // File shortcut
054    
055                    User user = userPersistence.findByPrimaryKey(userId);
056                    folderId = getFolderId(user.getCompanyId(), folderId);
057    
058                    validate(user, toFileEntryId);
059    
060                    long fileShortcutId = counterLocalService.increment();
061    
062                    DLFileShortcut fileShortcut = dlFileShortcutPersistence.create(
063                            fileShortcutId);
064    
065                    fileShortcut.setUuid(serviceContext.getUuid());
066                    fileShortcut.setGroupId(groupId);
067                    fileShortcut.setCompanyId(user.getCompanyId());
068                    fileShortcut.setUserId(user.getUserId());
069                    fileShortcut.setUserName(user.getFullName());
070                    fileShortcut.setRepositoryId(repositoryId);
071                    fileShortcut.setFolderId(folderId);
072                    fileShortcut.setToFileEntryId(toFileEntryId);
073                    fileShortcut.setTreePath(fileShortcut.buildTreePath());
074                    fileShortcut.setActive(true);
075                    fileShortcut.setStatus(WorkflowConstants.STATUS_APPROVED);
076                    fileShortcut.setStatusByUserId(userId);
077                    fileShortcut.setStatusByUserName(user.getFullName());
078                    fileShortcut.setStatusDate(new Date());
079    
080                    dlFileShortcutPersistence.update(fileShortcut);
081    
082                    // Resources
083    
084                    if (serviceContext.isAddGroupPermissions() ||
085                            serviceContext.isAddGuestPermissions()) {
086    
087                            addFileShortcutResources(
088                                    fileShortcut, serviceContext.isAddGroupPermissions(),
089                                    serviceContext.isAddGuestPermissions());
090                    }
091                    else {
092                            addFileShortcutResources(
093                                    fileShortcut, serviceContext.getModelPermissions());
094                    }
095    
096                    // Folder
097    
098                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
099                            dlFolderLocalService.updateLastPostDate(
100                                    folderId, fileShortcut.getModifiedDate());
101                    }
102    
103                    // Asset
104    
105                    FileEntry fileEntry = dlAppLocalService.getFileEntry(toFileEntryId);
106    
107                    copyAssetTags(fileEntry, serviceContext);
108    
109                    updateAsset(
110                            userId, fileShortcut, serviceContext.getAssetCategoryIds(),
111                            serviceContext.getAssetTagNames());
112    
113                    return fileShortcut;
114            }
115    
116            @Override
117            public void addFileShortcutResources(
118                            DLFileShortcut fileShortcut, boolean addGroupPermissions,
119                            boolean addGuestPermissions)
120                    throws PortalException {
121    
122                    resourceLocalService.addResources(
123                            fileShortcut.getCompanyId(), fileShortcut.getGroupId(),
124                            fileShortcut.getUserId(), DLFileShortcutConstants.getClassName(),
125                            fileShortcut.getFileShortcutId(), false, addGroupPermissions,
126                            addGuestPermissions);
127            }
128    
129            @Override
130            public void addFileShortcutResources(
131                            DLFileShortcut fileShortcut, ModelPermissions modelPermissions)
132                    throws PortalException {
133    
134                    resourceLocalService.addModelResources(
135                            fileShortcut.getCompanyId(), fileShortcut.getGroupId(),
136                            fileShortcut.getUserId(), DLFileShortcutConstants.getClassName(),
137                            fileShortcut.getFileShortcutId(), modelPermissions);
138            }
139    
140            @Override
141            public void addFileShortcutResources(
142                            long fileShortcutId, boolean addGroupPermissions,
143                            boolean addGuestPermissions)
144                    throws PortalException {
145    
146                    DLFileShortcut fileShortcut =
147                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
148    
149                    addFileShortcutResources(
150                            fileShortcut, addGroupPermissions, addGuestPermissions);
151            }
152    
153            @Override
154            public void addFileShortcutResources(
155                            long fileShortcutId, ModelPermissions modelPermissions)
156                    throws PortalException {
157    
158                    DLFileShortcut fileShortcut =
159                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
160    
161                    addFileShortcutResources(fileShortcut, modelPermissions);
162            }
163    
164            @Override
165            @SystemEvent(type = SystemEventConstants.TYPE_DELETE)
166            public void deleteFileShortcut(DLFileShortcut fileShortcut)
167                    throws PortalException {
168    
169                    // File shortcut
170    
171                    dlFileShortcutPersistence.remove(fileShortcut);
172    
173                    // Resources
174    
175                    resourceLocalService.deleteResource(
176                            fileShortcut.getCompanyId(), DLFileShortcutConstants.getClassName(),
177                            ResourceConstants.SCOPE_INDIVIDUAL,
178                            fileShortcut.getFileShortcutId());
179    
180                    // Asset
181    
182                    assetEntryLocalService.deleteEntry(
183                            DLFileShortcutConstants.getClassName(),
184                            fileShortcut.getFileShortcutId());
185    
186                    // Trash
187    
188                    if (fileShortcut.isInTrashExplicitly()) {
189                            trashEntryLocalService.deleteEntry(
190                                    DLFileShortcutConstants.getClassName(),
191                                    fileShortcut.getFileShortcutId());
192                    }
193                    else {
194                            trashVersionLocalService.deleteTrashVersion(
195                                    DLFileShortcutConstants.getClassName(),
196                                    fileShortcut.getFileShortcutId());
197                    }
198            }
199    
200            @Override
201            public void deleteFileShortcut(long fileShortcutId) throws PortalException {
202                    DLFileShortcut fileShortcut =
203                            dlFileShortcutLocalService.getDLFileShortcut(fileShortcutId);
204    
205                    dlFileShortcutLocalService.deleteFileShortcut(fileShortcut);
206            }
207    
208            @Override
209            public void deleteFileShortcuts(long toFileEntryId) throws PortalException {
210                    List<DLFileShortcut> fileShortcuts =
211                            dlFileShortcutPersistence.findByToFileEntryId(toFileEntryId);
212    
213                    for (DLFileShortcut fileShortcut : fileShortcuts) {
214                            dlFileShortcutLocalService.deleteFileShortcut(fileShortcut);
215                    }
216            }
217    
218            @Override
219            public void deleteFileShortcuts(long groupId, long folderId)
220                    throws PortalException {
221    
222                    deleteFileShortcuts(groupId, folderId, true);
223            }
224    
225            @Override
226            public void deleteFileShortcuts(
227                            long groupId, long folderId, boolean includeTrashedEntries)
228                    throws PortalException {
229    
230                    List<DLFileShortcut> fileShortcuts =
231                            dlFileShortcutPersistence.findByG_F(groupId, folderId);
232    
233                    for (DLFileShortcut fileShortcut : fileShortcuts) {
234                            if (includeTrashedEntries || !fileShortcut.isInTrashExplicitly()) {
235                                    dlFileShortcutLocalService.deleteFileShortcut(fileShortcut);
236                            }
237                    }
238            }
239    
240            @Override
241            public void disableFileShortcuts(long toFileEntryId) {
242                    updateFileShortcutsActive(toFileEntryId, false);
243            }
244    
245            @Override
246            public void enableFileShortcuts(long toFileEntryId) {
247                    updateFileShortcutsActive(toFileEntryId, true);
248            }
249    
250            @Override
251            public DLFileShortcut getFileShortcut(long fileShortcutId)
252                    throws PortalException {
253    
254                    return dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
255            }
256    
257            @Override
258            public List<DLFileShortcut> getFileShortcuts(long toFileEntryId) {
259                    return dlFileShortcutPersistence.findByToFileEntryId(toFileEntryId);
260            }
261    
262            @Override
263            public List<DLFileShortcut> getFileShortcuts(
264                    long groupId, long folderId, boolean active, int status, int start,
265                    int end) {
266    
267                    return dlFileShortcutPersistence.findByG_F_A_S(
268                            groupId, folderId, active, status, start, end);
269            }
270    
271            @Override
272            public int getFileShortcutsCount(
273                    long groupId, long folderId, boolean active, int status) {
274    
275                    return dlFileShortcutPersistence.countByG_F_A_S(
276                            groupId, folderId, active, status);
277            }
278    
279            @Override
280            public void rebuildTree(long companyId) throws PortalException {
281                    dlFolderLocalService.rebuildTree(companyId);
282            }
283    
284            @Override
285            public void setTreePaths(final long folderId, final String treePath)
286                    throws PortalException {
287    
288                    if (treePath == null) {
289                            throw new IllegalArgumentException("Tree path is null");
290                    }
291    
292                    ActionableDynamicQuery actionableDynamicQuery =
293                            getActionableDynamicQuery();
294    
295                    actionableDynamicQuery.setAddCriteriaMethod(
296                            new ActionableDynamicQuery.AddCriteriaMethod() {
297    
298                                    @Override
299                                    public void addCriteria(DynamicQuery dynamicQuery) {
300                                            Property folderIdProperty = PropertyFactoryUtil.forName(
301                                                    "folderId");
302    
303                                            dynamicQuery.add(folderIdProperty.eq(folderId));
304    
305                                            Property treePathProperty = PropertyFactoryUtil.forName(
306                                                    "treePath");
307    
308                                            dynamicQuery.add(
309                                                    RestrictionsFactoryUtil.or(
310                                                            treePathProperty.isNull(),
311                                                            treePathProperty.ne(treePath)));
312                                    }
313    
314                            });
315    
316                    actionableDynamicQuery.setPerformActionMethod(
317                            new ActionableDynamicQuery.PerformActionMethod<DLFileShortcut>() {
318    
319                                    @Override
320                                    public void performAction(DLFileShortcut dlFileShortcut) {
321                                            dlFileShortcut.setTreePath(treePath);
322    
323                                            updateDLFileShortcut(dlFileShortcut);
324                                    }
325    
326                            });
327    
328                    actionableDynamicQuery.performActions();
329            }
330    
331            @Override
332            public void updateAsset(
333                            long userId, DLFileShortcut fileShortcut, long[] assetCategoryIds,
334                            String[] assetTagNames)
335                    throws PortalException {
336    
337                    FileEntry fileEntry = dlAppLocalService.getFileEntry(
338                            fileShortcut.getToFileEntryId());
339    
340                    assetEntryLocalService.updateEntry(
341                            userId, fileShortcut.getGroupId(), fileShortcut.getCreateDate(),
342                            fileShortcut.getModifiedDate(),
343                            DLFileShortcutConstants.getClassName(),
344                            fileShortcut.getFileShortcutId(), fileShortcut.getUuid(), 0,
345                            assetCategoryIds, assetTagNames, false, null, null, null,
346                            fileEntry.getMimeType(), fileEntry.getTitle(),
347                            fileEntry.getDescription(), null, null, null, 0, 0, null);
348            }
349    
350            @Override
351            public DLFileShortcut updateFileShortcut(
352                            long userId, long fileShortcutId, long repositoryId, long folderId,
353                            long toFileEntryId, ServiceContext serviceContext)
354                    throws PortalException {
355    
356                    // File shortcut
357    
358                    User user = userPersistence.findByPrimaryKey(userId);
359    
360                    DLFileShortcut fileShortcut =
361                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
362    
363                    validate(user, toFileEntryId);
364    
365                    fileShortcut.setFolderId(folderId);
366                    fileShortcut.setToFileEntryId(toFileEntryId);
367                    fileShortcut.setTreePath(fileShortcut.buildTreePath());
368    
369                    dlFileShortcutPersistence.update(fileShortcut);
370    
371                    // Folder
372    
373                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
374                            dlFolderLocalService.updateLastPostDate(
375                                    folderId, fileShortcut.getModifiedDate());
376                    }
377    
378                    // Asset
379    
380                    FileEntry fileEntry = dlAppLocalService.getFileEntry(toFileEntryId);
381    
382                    copyAssetTags(fileEntry, serviceContext);
383    
384                    updateAsset(
385                            userId, fileShortcut, serviceContext.getAssetCategoryIds(),
386                            serviceContext.getAssetTagNames());
387    
388                    return fileShortcut;
389            }
390    
391            @Override
392            public void updateFileShortcuts(
393                    long oldToFileEntryId, long newToFileEntryId) {
394    
395                    List<DLFileShortcut> fileShortcuts =
396                            dlFileShortcutPersistence.findByToFileEntryId(oldToFileEntryId);
397    
398                    for (DLFileShortcut fileShortcut : fileShortcuts) {
399                            fileShortcut.setToFileEntryId(newToFileEntryId);
400    
401                            dlFileShortcutPersistence.update(fileShortcut);
402                    }
403            }
404    
405            @Override
406            public void updateFileShortcutsActive(long toFileEntryId, boolean active) {
407                    List<DLFileShortcut> fileShortcuts =
408                            dlFileShortcutPersistence.findByToFileEntryId(toFileEntryId);
409    
410                    for (DLFileShortcut fileShortcut : fileShortcuts) {
411                            fileShortcut.setActive(active);
412    
413                            dlFileShortcutPersistence.update(fileShortcut);
414                    }
415            }
416    
417            @Override
418            public void updateStatus(
419                            long userId, long fileShortcutId, int status,
420                            ServiceContext serviceContext)
421                    throws PortalException {
422    
423                    User user = userPersistence.findByPrimaryKey(userId);
424    
425                    DLFileShortcut fileShortcut =
426                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
427    
428                    fileShortcut.setStatus(status);
429                    fileShortcut.setStatusByUserId(user.getUserId());
430                    fileShortcut.setStatusByUserName(user.getFullName());
431                    fileShortcut.setStatusDate(serviceContext.getModifiedDate(null));
432    
433                    dlFileShortcutPersistence.update(fileShortcut);
434            }
435    
436            protected void copyAssetTags(
437                            FileEntry fileEntry, ServiceContext serviceContext)
438                    throws PortalException {
439    
440                    String[] assetTagNames = assetTagLocalService.getTagNames(
441                            FileEntry.class.getName(), fileEntry.getFileEntryId());
442    
443                    assetTagLocalService.checkTags(
444                            serviceContext.getUserId(), serviceContext.getScopeGroupId(),
445                            assetTagNames);
446    
447                    serviceContext.setAssetTagNames(assetTagNames);
448            }
449    
450            protected long getFolderId(long companyId, long folderId) {
451                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
452    
453                            // Ensure folder exists and belongs to the proper company
454    
455                            DLFolder dlFolder = dlFolderPersistence.fetchByPrimaryKey(folderId);
456    
457                            if ((dlFolder == null) || (companyId != dlFolder.getCompanyId())) {
458                                    folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
459                            }
460                    }
461    
462                    return folderId;
463            }
464    
465            protected void validate(User user, long toFileEntryId)
466                    throws PortalException {
467    
468                    FileEntry fileEntry = dlAppLocalService.getFileEntry(toFileEntryId);
469    
470                    if (user.getCompanyId() != fileEntry.getCompanyId()) {
471                            throw new NoSuchFileEntryException(
472                                    "{fileEntryId=" + toFileEntryId + "}");
473                    }
474            }
475    
476    }