1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.imagegallery.service.impl;
16  
17  import com.liferay.portal.kernel.exception.PortalException;
18  import com.liferay.portal.kernel.exception.SystemException;
19  import com.liferay.portal.kernel.search.Indexer;
20  import com.liferay.portal.kernel.search.IndexerRegistryUtil;
21  import com.liferay.portal.kernel.util.FileUtil;
22  import com.liferay.portal.kernel.util.StringPool;
23  import com.liferay.portal.model.ResourceConstants;
24  import com.liferay.portal.model.User;
25  import com.liferay.portal.service.ServiceContext;
26  import com.liferay.portlet.asset.util.AssetUtil;
27  import com.liferay.portlet.imagegallery.DuplicateFolderNameException;
28  import com.liferay.portlet.imagegallery.FolderNameException;
29  import com.liferay.portlet.imagegallery.model.IGFolder;
30  import com.liferay.portlet.imagegallery.model.IGFolderConstants;
31  import com.liferay.portlet.imagegallery.model.IGImage;
32  import com.liferay.portlet.imagegallery.service.base.IGFolderLocalServiceBaseImpl;
33  
34  import java.util.ArrayList;
35  import java.util.Date;
36  import java.util.List;
37  
38  /**
39   * <a href="IGFolderLocalServiceImpl.java.html"><b><i>View Source</i></b></a>
40   *
41   * @author Brian Wing Shun Chan
42   * @author Alexander Chow
43   */
44  public class IGFolderLocalServiceImpl extends IGFolderLocalServiceBaseImpl {
45  
46      public IGFolder addFolder(
47              String uuid, long userId, long parentFolderId, String name,
48              String description, ServiceContext serviceContext)
49          throws PortalException, SystemException {
50  
51          User user = userPersistence.findByPrimaryKey(userId);
52          long groupId = serviceContext.getScopeGroupId();
53          parentFolderId = getParentFolderId(groupId, parentFolderId);
54          Date now = new Date();
55  
56          validate(groupId, parentFolderId, name);
57  
58          long folderId = counterLocalService.increment();
59  
60          IGFolder folder = igFolderPersistence.create(folderId);
61  
62          folder.setUuid(uuid);
63          folder.setGroupId(groupId);
64          folder.setCompanyId(user.getCompanyId());
65          folder.setUserId(user.getUserId());
66          folder.setCreateDate(now);
67          folder.setModifiedDate(now);
68          folder.setParentFolderId(parentFolderId);
69          folder.setName(name);
70          folder.setDescription(description);
71          folder.setExpandoBridgeAttributes(serviceContext);
72  
73          igFolderPersistence.update(folder, false);
74  
75          // Resources
76  
77          if (serviceContext.getAddCommunityPermissions() ||
78              serviceContext.getAddGuestPermissions()) {
79  
80              addFolderResources(
81                  folder, serviceContext.getAddCommunityPermissions(),
82                  serviceContext.getAddGuestPermissions());
83          }
84          else {
85              addFolderResources(
86                  folder, serviceContext.getCommunityPermissions(),
87                  serviceContext.getGuestPermissions());
88          }
89  
90          return folder;
91      }
92  
93      public void addFolderResources(
94              IGFolder folder, boolean addCommunityPermissions,
95              boolean addGuestPermissions)
96          throws PortalException, SystemException {
97  
98          resourceLocalService.addResources(
99              folder.getCompanyId(), folder.getGroupId(), folder.getUserId(),
100             IGFolder.class.getName(), folder.getFolderId(), false,
101             addCommunityPermissions, addGuestPermissions);
102     }
103 
104     public void addFolderResources(
105             IGFolder folder, String[] communityPermissions,
106             String[] guestPermissions)
107         throws PortalException, SystemException {
108 
109         resourceLocalService.addModelResources(
110             folder.getCompanyId(), folder.getGroupId(), folder.getUserId(),
111             IGFolder.class.getName(), folder.getFolderId(),
112             communityPermissions, guestPermissions);
113     }
114 
115     public void addFolderResources(
116             long folderId, boolean addCommunityPermissions,
117             boolean addGuestPermissions)
118         throws PortalException, SystemException {
119 
120         IGFolder folder = igFolderPersistence.findByPrimaryKey(folderId);
121 
122         addFolderResources(
123             folder, addCommunityPermissions, addGuestPermissions);
124     }
125 
126     public void addFolderResources(
127             long folderId, String[] communityPermissions,
128             String[] guestPermissions)
129         throws PortalException, SystemException {
130 
131         IGFolder folder = igFolderPersistence.findByPrimaryKey(folderId);
132 
133         addFolderResources(folder, communityPermissions, guestPermissions);
134     }
135 
136     public void deleteFolder(IGFolder folder)
137         throws PortalException, SystemException {
138 
139         // Folder
140 
141         igFolderPersistence.remove(folder);
142 
143         // Resources
144 
145         resourceLocalService.deleteResource(
146             folder.getCompanyId(), IGFolder.class.getName(),
147             ResourceConstants.SCOPE_INDIVIDUAL, folder.getFolderId());
148 
149         // Folders
150 
151         List<IGFolder> folders = igFolderPersistence.findByG_P(
152             folder.getGroupId(), folder.getFolderId());
153 
154         for (IGFolder curFolder : folders) {
155             deleteFolder(curFolder);
156         }
157 
158         // Images
159 
160         igImageLocalService.deleteImages(
161             folder.getGroupId(), folder.getFolderId());
162 
163         // Expando
164 
165         expandoValueLocalService.deleteValues(
166             IGFolder.class.getName(), folder.getFolderId());
167     }
168 
169     public void deleteFolder(long folderId)
170         throws PortalException, SystemException {
171 
172         IGFolder folder = igFolderPersistence.findByPrimaryKey(folderId);
173 
174         deleteFolder(folder);
175     }
176 
177     public void deleteFolders(long groupId)
178         throws PortalException, SystemException {
179 
180         List<IGFolder> folders = igFolderPersistence.findByG_P(
181             groupId, IGFolderConstants.DEFAULT_PARENT_FOLDER_ID);
182 
183         for (IGFolder folder : folders) {
184             deleteFolder(folder);
185         }
186     }
187 
188     public List<IGFolder> getCompanyFolders(long companyId, int start, int end)
189         throws SystemException {
190 
191         return igFolderPersistence.findByCompanyId(companyId, start, end);
192     }
193 
194     public int getCompanyFoldersCount(long companyId) throws SystemException {
195         return igFolderPersistence.countByCompanyId(companyId);
196     }
197 
198     public IGFolder getFolder(long folderId)
199         throws PortalException, SystemException {
200 
201         return igFolderPersistence.findByPrimaryKey(folderId);
202     }
203 
204     public IGFolder getFolder(long groupId, long parentFolderId, String name)
205         throws PortalException, SystemException {
206 
207         return igFolderPersistence.findByG_P_N(groupId, parentFolderId, name);
208     }
209 
210     public List<IGFolder> getFolders(long groupId) throws SystemException {
211         return igFolderPersistence.findByGroupId(groupId);
212     }
213 
214     public List<IGFolder> getFolders(long groupId, long parentFolderId)
215         throws SystemException {
216 
217         return igFolderPersistence.findByG_P(groupId, parentFolderId);
218     }
219 
220     public List<IGFolder> getFolders(
221             long groupId, long parentFolderId, int start, int end)
222         throws SystemException {
223 
224         return igFolderPersistence.findByG_P(
225             groupId, parentFolderId, start, end);
226     }
227 
228     public int getFoldersCount(long groupId, long parentFolderId)
229         throws SystemException {
230 
231         return igFolderPersistence.countByG_P(groupId, parentFolderId);
232     }
233 
234     public void getSubfolderIds(
235             List<Long> folderIds, long groupId, long folderId)
236         throws SystemException {
237 
238         List<IGFolder> folders = igFolderPersistence.findByG_P(
239             groupId, folderId);
240 
241         for (IGFolder folder : folders) {
242             folderIds.add(folder.getFolderId());
243 
244             getSubfolderIds(
245                 folderIds, folder.getGroupId(), folder.getFolderId());
246         }
247     }
248 
249     public IGFolder updateFolder(
250             long folderId, long parentFolderId, String name, String description,
251             boolean mergeWithParentFolder, ServiceContext serviceContext)
252         throws PortalException, SystemException {
253 
254         // Merge folders
255 
256         IGFolder folder = igFolderPersistence.findByPrimaryKey(folderId);
257 
258         parentFolderId = getParentFolderId(folder, parentFolderId);
259 
260         if (mergeWithParentFolder && (folderId != parentFolderId)) {
261             mergeFolders(folder, parentFolderId);
262 
263             return folder;
264         }
265 
266         // Folder
267 
268         validate(
269             folder.getFolderId(), folder.getGroupId(), parentFolderId, name);
270 
271         folder.setModifiedDate(new Date());
272         folder.setParentFolderId(parentFolderId);
273         folder.setName(name);
274         folder.setDescription(description);
275         folder.setExpandoBridgeAttributes(serviceContext);
276 
277         igFolderPersistence.update(folder, false);
278 
279         return folder;
280     }
281 
282     protected long getParentFolderId(IGFolder folder, long parentFolderId)
283         throws SystemException {
284 
285         if (parentFolderId == IGFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
286             return parentFolderId;
287         }
288 
289         if (folder.getFolderId() == parentFolderId) {
290             return folder.getParentFolderId();
291         }
292         else {
293             IGFolder parentFolder = igFolderPersistence.fetchByPrimaryKey(
294                 parentFolderId);
295 
296             if ((parentFolder == null) ||
297                 (folder.getGroupId() != parentFolder.getGroupId())) {
298 
299                 return folder.getParentFolderId();
300             }
301 
302             List<Long> subfolderIds = new ArrayList<Long>();
303 
304             getSubfolderIds(
305                 subfolderIds, folder.getGroupId(), folder.getFolderId());
306 
307             if (subfolderIds.contains(parentFolderId)) {
308                 return folder.getParentFolderId();
309             }
310 
311             return parentFolderId;
312         }
313     }
314 
315     protected long getParentFolderId(long groupId, long parentFolderId)
316         throws SystemException {
317 
318         if (parentFolderId != IGFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
319             IGFolder parentFolder = igFolderPersistence.fetchByPrimaryKey(
320                 parentFolderId);
321 
322             if ((parentFolder == null) ||
323                 (groupId != parentFolder.getGroupId())) {
324 
325                 parentFolderId = IGFolderConstants.DEFAULT_PARENT_FOLDER_ID;
326             }
327         }
328 
329         return parentFolderId;
330     }
331 
332     protected void mergeFolders(IGFolder fromFolder, long toFolderId)
333         throws PortalException, SystemException {
334 
335         List<IGFolder> folders = igFolderPersistence.findByG_P(
336             fromFolder.getGroupId(), fromFolder.getFolderId());
337 
338         for (IGFolder folder : folders) {
339             mergeFolders(folder, toFolderId);
340         }
341 
342         List<IGImage> images = igImagePersistence.findByG_F(
343             fromFolder.getGroupId(), fromFolder.getFolderId());
344 
345         for (IGImage image : images) {
346             image.setFolderId(toFolderId);
347 
348             igImagePersistence.update(image, false);
349 
350             Indexer indexer = IndexerRegistryUtil.getIndexer(IGImage.class);
351 
352             indexer.reindex(image);
353         }
354 
355         deleteFolder(fromFolder);
356     }
357 
358     protected void validate(
359             long folderId, long groupId, long parentFolderId, String name)
360         throws PortalException, SystemException {
361 
362         if (!AssetUtil.isValidWord(name)) {
363             throw new FolderNameException();
364         }
365 
366         IGFolder folder = igFolderPersistence.fetchByG_P_N(
367             groupId, parentFolderId, name);
368 
369         if ((folder != null) && (folder.getFolderId() != folderId)) {
370             throw new DuplicateFolderNameException();
371         }
372 
373         if (name.indexOf(StringPool.PERIOD) != -1) {
374             String nameWithExtension = name;
375 
376             name = FileUtil.stripExtension(nameWithExtension);
377 
378             List<IGImage> images = igImagePersistence.findByG_F_N(
379                 groupId, parentFolderId, name);
380 
381             for (IGImage image : images) {
382                 if (nameWithExtension.equals(image.getNameWithExtension())) {
383                     throw new DuplicateFolderNameException();
384                 }
385             }
386         }
387     }
388 
389     protected void validate(long groupId, long parentFolderId, String name)
390         throws PortalException, SystemException {
391 
392         long folderId = 0;
393 
394         validate(folderId, groupId, parentFolderId, name);
395     }
396 
397 }