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.DLFolder;
032    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
033    import com.liferay.portlet.documentlibrary.service.base.DLFileShortcutLocalServiceBaseImpl;
034    
035    import java.util.Date;
036    import java.util.List;
037    
038    /**
039     * @author Brian Wing Shun Chan
040     */
041    public class DLFileShortcutLocalServiceImpl
042            extends DLFileShortcutLocalServiceBaseImpl {
043    
044            @Override
045            public DLFileShortcut addFileShortcut(
046                            long userId, long groupId, long folderId, long toFileEntryId,
047                            ServiceContext serviceContext)
048                    throws PortalException {
049    
050                    // File shortcut
051    
052                    User user = userPersistence.findByPrimaryKey(userId);
053                    folderId = getFolderId(user.getCompanyId(), folderId);
054                    Date now = new Date();
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.setCreateDate(serviceContext.getCreateDate(now));
069                    fileShortcut.setModifiedDate(serviceContext.getModifiedDate(now));
070                    fileShortcut.setFolderId(folderId);
071                    fileShortcut.setToFileEntryId(toFileEntryId);
072                    fileShortcut.setTreePath(fileShortcut.buildTreePath());
073                    fileShortcut.setActive(true);
074                    fileShortcut.setStatus(WorkflowConstants.STATUS_APPROVED);
075                    fileShortcut.setStatusByUserId(userId);
076                    fileShortcut.setStatusByUserName(user.getFullName());
077                    fileShortcut.setStatusDate(now);
078    
079                    dlFileShortcutPersistence.update(fileShortcut);
080    
081                    // Resources
082    
083                    if (serviceContext.isAddGroupPermissions() ||
084                            serviceContext.isAddGuestPermissions()) {
085    
086                            addFileShortcutResources(
087                                    fileShortcut, serviceContext.isAddGroupPermissions(),
088                                    serviceContext.isAddGuestPermissions());
089                    }
090                    else {
091                            addFileShortcutResources(
092                                    fileShortcut, serviceContext.getGroupPermissions(),
093                                    serviceContext.getGuestPermissions());
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(), DLFileShortcut.class.getName(),
125                            fileShortcut.getFileShortcutId(), false, addGroupPermissions,
126                            addGuestPermissions);
127            }
128    
129            @Override
130            public void addFileShortcutResources(
131                            DLFileShortcut fileShortcut, String[] groupPermissions,
132                            String[] guestPermissions)
133                    throws PortalException {
134    
135                    resourceLocalService.addModelResources(
136                            fileShortcut.getCompanyId(), fileShortcut.getGroupId(),
137                            fileShortcut.getUserId(), DLFileShortcut.class.getName(),
138                            fileShortcut.getFileShortcutId(), groupPermissions,
139                            guestPermissions);
140            }
141    
142            @Override
143            public void addFileShortcutResources(
144                            long fileShortcutId, boolean addGroupPermissions,
145                            boolean addGuestPermissions)
146                    throws PortalException {
147    
148                    DLFileShortcut fileShortcut =
149                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
150    
151                    addFileShortcutResources(
152                            fileShortcut, addGroupPermissions, addGuestPermissions);
153            }
154    
155            @Override
156            public void addFileShortcutResources(
157                            long fileShortcutId, String[] groupPermissions,
158                            String[] guestPermissions)
159                    throws PortalException {
160    
161                    DLFileShortcut fileShortcut =
162                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
163    
164                    addFileShortcutResources(
165                            fileShortcut, groupPermissions, guestPermissions);
166            }
167    
168            @Override
169            @SystemEvent(type = SystemEventConstants.TYPE_DELETE)
170            public void deleteFileShortcut(DLFileShortcut fileShortcut)
171                    throws PortalException {
172    
173                    // File shortcut
174    
175                    dlFileShortcutPersistence.remove(fileShortcut);
176    
177                    // Resources
178    
179                    resourceLocalService.deleteResource(
180                            fileShortcut.getCompanyId(), DLFileShortcut.class.getName(),
181                            ResourceConstants.SCOPE_INDIVIDUAL,
182                            fileShortcut.getFileShortcutId());
183    
184                    // Asset
185    
186                    assetEntryLocalService.deleteEntry(
187                            DLFileShortcut.class.getName(), fileShortcut.getFileShortcutId());
188    
189                    // Trash
190    
191                    if (fileShortcut.isInTrashExplicitly()) {
192                            trashEntryLocalService.deleteEntry(
193                                    DLFileShortcut.class.getName(),
194                                    fileShortcut.getFileShortcutId());
195                    }
196                    else {
197                            trashVersionLocalService.deleteTrashVersion(
198                                    DLFileShortcut.class.getName(),
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(
276                    long groupId, long folderId, boolean active, int status, int start,
277                    int end) {
278    
279                    return dlFileShortcutPersistence.findByG_F_A_S(
280                            groupId, folderId, active, status, start, end);
281            }
282    
283            @Override
284            public int getFileShortcutsCount(
285                    long groupId, long folderId, boolean active, int status) {
286    
287                    return dlFileShortcutPersistence.countByG_F_A_S(
288                            groupId, folderId, active, status);
289            }
290    
291            @Override
292            public void rebuildTree(long companyId) throws PortalException {
293                    dlFolderLocalService.rebuildTree(companyId);
294            }
295    
296            @Override
297            public void setTreePaths(final long folderId, final String treePath)
298                    throws PortalException {
299    
300                    ActionableDynamicQuery actionableDynamicQuery =
301                            getActionableDynamicQuery();
302    
303                    actionableDynamicQuery.setAddCriteriaMethod(
304                            new ActionableDynamicQuery.AddCriteriaMethod() {
305    
306                                    @Override
307                                    public void addCriteria(DynamicQuery dynamicQuery) {
308                                            Property folderIdProperty = PropertyFactoryUtil.forName(
309                                                    "folderId");
310    
311                                            dynamicQuery.add(folderIdProperty.eq(folderId));
312    
313                                            Property treePathProperty = PropertyFactoryUtil.forName(
314                                                    "treePath");
315    
316                                            dynamicQuery.add(treePathProperty.ne(treePath));
317                                    }
318    
319                            });
320    
321                    actionableDynamicQuery.setPerformActionMethod(
322                            new ActionableDynamicQuery.PerformActionMethod() {
323    
324                                    @Override
325                                    public void performAction(Object object) {
326                                            DLFileShortcut dlFileShortcut = (DLFileShortcut)object;
327    
328                                            dlFileShortcut.setTreePath(treePath);
329    
330                                            updateDLFileShortcut(dlFileShortcut);
331                                    }
332    
333                            });
334    
335                    actionableDynamicQuery.performActions();
336            }
337    
338            @Override
339            public void updateAsset(
340                            long userId, DLFileShortcut fileShortcut, long[] assetCategoryIds,
341                            String[] assetTagNames)
342                    throws PortalException {
343    
344                    FileEntry fileEntry = dlAppLocalService.getFileEntry(
345                            fileShortcut.getToFileEntryId());
346    
347                    assetEntryLocalService.updateEntry(
348                            userId, fileShortcut.getGroupId(), fileShortcut.getCreateDate(),
349                            fileShortcut.getModifiedDate(), DLFileShortcut.class.getName(),
350                            fileShortcut.getFileShortcutId(), fileShortcut.getUuid(), 0,
351                            assetCategoryIds, assetTagNames, false, null, null, null,
352                            fileEntry.getMimeType(), fileEntry.getTitle(),
353                            fileEntry.getDescription(), null, null, null, 0, 0, null, false);
354            }
355    
356            @Override
357            public DLFileShortcut updateFileShortcut(
358                            long userId, long fileShortcutId, long folderId, long toFileEntryId,
359                            ServiceContext serviceContext)
360                    throws PortalException {
361    
362                    // File shortcut
363    
364                    User user = userPersistence.findByPrimaryKey(userId);
365    
366                    DLFileShortcut fileShortcut =
367                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
368    
369                    validate(user, toFileEntryId);
370    
371                    fileShortcut.setModifiedDate(
372                            serviceContext.getModifiedDate(new Date()));
373                    fileShortcut.setFolderId(folderId);
374                    fileShortcut.setToFileEntryId(toFileEntryId);
375                    fileShortcut.setTreePath(fileShortcut.buildTreePath());
376    
377                    dlFileShortcutPersistence.update(fileShortcut);
378    
379                    // Folder
380    
381                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
382                            dlFolderLocalService.updateLastPostDate(
383                                    folderId, fileShortcut.getModifiedDate());
384                    }
385    
386                    // Asset
387    
388                    FileEntry fileEntry = dlAppLocalService.getFileEntry(toFileEntryId);
389    
390                    copyAssetTags(fileEntry, serviceContext);
391    
392                    updateAsset(
393                            userId, fileShortcut, serviceContext.getAssetCategoryIds(),
394                            serviceContext.getAssetTagNames());
395    
396                    return fileShortcut;
397            }
398    
399            @Override
400            public void updateFileShortcuts(
401                    long oldToFileEntryId, long newToFileEntryId) {
402    
403                    List<DLFileShortcut> fileShortcuts =
404                            dlFileShortcutPersistence.findByToFileEntryId(oldToFileEntryId);
405    
406                    for (DLFileShortcut fileShortcut : fileShortcuts) {
407                            fileShortcut.setToFileEntryId(newToFileEntryId);
408    
409                            dlFileShortcutPersistence.update(fileShortcut);
410                    }
411            }
412    
413            @Override
414            public void updateStatus(
415                            long userId, long fileShortcutId, int status,
416                            ServiceContext serviceContext)
417                    throws PortalException {
418    
419                    User user = userPersistence.findByPrimaryKey(userId);
420    
421                    DLFileShortcut fileShortcut =
422                            dlFileShortcutPersistence.findByPrimaryKey(fileShortcutId);
423    
424                    fileShortcut.setStatus(status);
425                    fileShortcut.setStatusByUserId(user.getUserId());
426                    fileShortcut.setStatusByUserName(user.getFullName());
427                    fileShortcut.setStatusDate(serviceContext.getModifiedDate(new Date()));
428    
429                    dlFileShortcutPersistence.update(fileShortcut);
430            }
431    
432            protected void copyAssetTags(
433                            FileEntry fileEntry, ServiceContext serviceContext)
434                    throws PortalException {
435    
436                    String[] assetTagNames = assetTagLocalService.getTagNames(
437                            FileEntry.class.getName(), fileEntry.getFileEntryId());
438    
439                    assetTagLocalService.checkTags(
440                            serviceContext.getUserId(), serviceContext.getScopeGroupId(),
441                            assetTagNames);
442    
443                    serviceContext.setAssetTagNames(assetTagNames);
444            }
445    
446            protected long getFolderId(long companyId, long folderId) {
447                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
448    
449                            // Ensure folder exists and belongs to the proper company
450    
451                            DLFolder dlFolder = dlFolderPersistence.fetchByPrimaryKey(folderId);
452    
453                            if ((dlFolder == null) || (companyId != dlFolder.getCompanyId())) {
454                                    folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
455                            }
456                    }
457    
458                    return folderId;
459            }
460    
461            protected void validate(User user, long toFileEntryId)
462                    throws PortalException {
463    
464                    FileEntry fileEntry = dlAppLocalService.getFileEntry(toFileEntryId);
465    
466                    if (user.getCompanyId() != fileEntry.getCompanyId()) {
467                            throw new NoSuchFileEntryException(
468                                    "{fileEntryId=" + toFileEntryId + "}");
469                    }
470            }
471    
472    }