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