1   /**
2    * Copyright (c) 2000-2007 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.imagegallery.service.impl;
24  
25  import com.liferay.counter.service.CounterLocalServiceUtil;
26  import com.liferay.portal.PortalException;
27  import com.liferay.portal.SystemException;
28  import com.liferay.portal.kernel.util.Validator;
29  import com.liferay.portal.model.User;
30  import com.liferay.portal.model.impl.ResourceImpl;
31  import com.liferay.portal.service.ResourceLocalServiceUtil;
32  import com.liferay.portal.service.persistence.UserUtil;
33  import com.liferay.portal.util.PortalUtil;
34  import com.liferay.portlet.imagegallery.FolderNameException;
35  import com.liferay.portlet.imagegallery.model.IGFolder;
36  import com.liferay.portlet.imagegallery.model.IGImage;
37  import com.liferay.portlet.imagegallery.model.impl.IGFolderImpl;
38  import com.liferay.portlet.imagegallery.service.IGImageLocalServiceUtil;
39  import com.liferay.portlet.imagegallery.service.base.IGFolderLocalServiceBaseImpl;
40  import com.liferay.portlet.imagegallery.service.persistence.IGFolderUtil;
41  import com.liferay.portlet.imagegallery.service.persistence.IGImageUtil;
42  
43  import java.util.ArrayList;
44  import java.util.Date;
45  import java.util.Iterator;
46  import java.util.List;
47  
48  /**
49   * <a href="IGFolderLocalServiceImpl.java.html"><b><i>View Source</i></b></a>
50   *
51   * @author Brian Wing Shun Chan
52   *
53   */
54  public class IGFolderLocalServiceImpl extends IGFolderLocalServiceBaseImpl {
55  
56      public IGFolder addFolder(
57              long userId, long plid, long parentFolderId, String name,
58              String description, boolean addCommunityPermissions,
59              boolean addGuestPermissions)
60          throws PortalException, SystemException {
61  
62          return addFolder(
63              userId, plid, parentFolderId, name, description,
64              Boolean.valueOf(addCommunityPermissions),
65              Boolean.valueOf(addGuestPermissions), null, null);
66      }
67  
68      public IGFolder addFolder(
69              long userId, long plid, long parentFolderId, String name,
70              String description, String[] communityPermissions,
71              String[] guestPermissions)
72          throws PortalException, SystemException {
73  
74          return addFolder(
75              userId, plid, parentFolderId, name, description, null, null,
76              communityPermissions, guestPermissions);
77      }
78  
79      public IGFolder addFolder(
80              long userId, long plid, long parentFolderId, String name,
81              String description, Boolean addCommunityPermissions,
82              Boolean addGuestPermissions, String[] communityPermissions,
83              String[] guestPermissions)
84          throws PortalException, SystemException {
85  
86          long groupId = PortalUtil.getPortletGroupId(plid);
87  
88          return addFolderToGroup(
89              userId, groupId, parentFolderId, name, description,
90              addCommunityPermissions, addGuestPermissions, communityPermissions,
91              guestPermissions);
92      }
93  
94      public IGFolder addFolderToGroup(
95              long userId, long groupId, long parentFolderId, String name,
96              String description, Boolean addCommunityPermissions,
97              Boolean addGuestPermissions, String[] communityPermissions,
98              String[] guestPermissions)
99          throws PortalException, SystemException {
100 
101         // Folder
102 
103         User user = UserUtil.findByPrimaryKey(userId);
104         parentFolderId = getParentFolderId(groupId, parentFolderId);
105         Date now = new Date();
106 
107         validate(name);
108 
109         long folderId = CounterLocalServiceUtil.increment();
110 
111         IGFolder folder = IGFolderUtil.create(folderId);
112 
113         folder.setGroupId(groupId);
114         folder.setCompanyId(user.getCompanyId());
115         folder.setUserId(user.getUserId());
116         folder.setCreateDate(now);
117         folder.setModifiedDate(now);
118         folder.setParentFolderId(parentFolderId);
119         folder.setName(name);
120         folder.setDescription(description);
121 
122         IGFolderUtil.update(folder);
123 
124         // Resources
125 
126         if ((addCommunityPermissions != null) &&
127             (addGuestPermissions != null)) {
128 
129             addFolderResources(
130                 folder, addCommunityPermissions.booleanValue(),
131                 addGuestPermissions.booleanValue());
132         }
133         else {
134             addFolderResources(folder, communityPermissions, guestPermissions);
135         }
136 
137         return folder;
138     }
139 
140     public void addFolderResources(
141             long folderId, boolean addCommunityPermissions,
142             boolean addGuestPermissions)
143         throws PortalException, SystemException {
144 
145         IGFolder folder = IGFolderUtil.findByPrimaryKey(folderId);
146 
147         addFolderResources(
148             folder, addCommunityPermissions, addGuestPermissions);
149     }
150 
151     public void addFolderResources(
152             IGFolder folder, boolean addCommunityPermissions,
153             boolean addGuestPermissions)
154         throws PortalException, SystemException {
155 
156         ResourceLocalServiceUtil.addResources(
157             folder.getCompanyId(), folder.getGroupId(), folder.getUserId(),
158             IGFolder.class.getName(), folder.getFolderId(), false,
159             addCommunityPermissions, addGuestPermissions);
160     }
161 
162     public void addFolderResources(
163             long folderId, String[] communityPermissions,
164             String[] guestPermissions)
165         throws PortalException, SystemException {
166 
167         IGFolder folder = IGFolderUtil.findByPrimaryKey(folderId);
168 
169         addFolderResources(folder, communityPermissions, guestPermissions);
170     }
171 
172     public void addFolderResources(
173             IGFolder folder, String[] communityPermissions,
174             String[] guestPermissions)
175         throws PortalException, SystemException {
176 
177         ResourceLocalServiceUtil.addModelResources(
178             folder.getCompanyId(), folder.getGroupId(), folder.getUserId(),
179             IGFolder.class.getName(), folder.getFolderId(),
180             communityPermissions, guestPermissions);
181     }
182 
183     public void deleteFolder(long folderId)
184         throws PortalException, SystemException {
185 
186         IGFolder folder = IGFolderUtil.findByPrimaryKey(folderId);
187 
188         deleteFolder(folder);
189     }
190 
191     public void deleteFolder(IGFolder folder)
192         throws PortalException, SystemException {
193 
194         // Folders
195 
196         Iterator itr = IGFolderUtil.findByG_P(
197             folder.getGroupId(), folder.getFolderId()).iterator();
198 
199         while (itr.hasNext()) {
200             IGFolder curFolder = (IGFolder)itr.next();
201 
202             deleteFolder(curFolder);
203         }
204 
205         // Images
206 
207         IGImageLocalServiceUtil.deleteImages(folder.getFolderId());
208 
209         // Resources
210 
211         ResourceLocalServiceUtil.deleteResource(
212             folder.getCompanyId(), IGFolder.class.getName(),
213             ResourceImpl.SCOPE_INDIVIDUAL, folder.getFolderId());
214 
215         // Folder
216 
217         IGFolderUtil.remove(folder.getFolderId());
218     }
219 
220     public void deleteFolders(long groupId)
221         throws PortalException, SystemException {
222 
223         Iterator itr = IGFolderUtil.findByG_P(
224             groupId, IGFolderImpl.DEFAULT_PARENT_FOLDER_ID).iterator();
225 
226         while (itr.hasNext()) {
227             IGFolder folder = (IGFolder)itr.next();
228 
229             deleteFolder(folder);
230         }
231     }
232 
233     public IGFolder getFolder(long folderId)
234         throws PortalException, SystemException {
235 
236         return IGFolderUtil.findByPrimaryKey(folderId);
237     }
238 
239     public List getFolders(long groupId) throws SystemException {
240         return IGFolderUtil.findByGroupId(groupId);
241     }
242 
243     public List getFolders(long groupId, long parentFolderId)
244         throws SystemException {
245 
246         return IGFolderUtil.findByG_P(groupId, parentFolderId);
247     }
248 
249     public List getFolders(
250             long groupId, long parentFolderId, int begin, int end)
251         throws SystemException {
252 
253         return IGFolderUtil.findByG_P(groupId, parentFolderId, begin, end);
254     }
255 
256     public int getFoldersCount(long groupId, long parentFolderId)
257         throws SystemException {
258 
259         return IGFolderUtil.countByG_P(groupId, parentFolderId);
260     }
261 
262     public void getSubfolderIds(
263             List folderIds, long groupId, long folderId)
264         throws SystemException {
265 
266         Iterator itr = IGFolderUtil.findByG_P(groupId, folderId).iterator();
267 
268         while (itr.hasNext()) {
269             IGFolder folder = (IGFolder)itr.next();
270 
271             folderIds.add(new Long(folder.getFolderId()));
272 
273             getSubfolderIds(
274                 folderIds, folder.getGroupId(), folder.getFolderId());
275         }
276     }
277 
278     public IGFolder updateFolder(
279             long folderId, long parentFolderId, String name, String description,
280             boolean mergeWithParentFolder)
281         throws PortalException, SystemException {
282 
283         // Folder
284 
285         IGFolder folder = IGFolderUtil.findByPrimaryKey(folderId);
286 
287         parentFolderId = getParentFolderId(folder, parentFolderId);
288 
289         validate(name);
290 
291         folder.setModifiedDate(new Date());
292         folder.setParentFolderId(parentFolderId);
293         folder.setName(name);
294         folder.setDescription(description);
295 
296         IGFolderUtil.update(folder);
297 
298         // Merge folders
299 
300         if (mergeWithParentFolder && (folderId != parentFolderId) &&
301             (parentFolderId != IGFolderImpl.DEFAULT_PARENT_FOLDER_ID)) {
302 
303             mergeFolders(folder, parentFolderId);
304         }
305 
306         return folder;
307     }
308 
309     protected long getParentFolderId(long groupId, long parentFolderId)
310         throws SystemException {
311 
312         if (parentFolderId != IGFolderImpl.DEFAULT_PARENT_FOLDER_ID) {
313             IGFolder parentFolder =
314                 IGFolderUtil.fetchByPrimaryKey(parentFolderId);
315 
316             if ((parentFolder == null) ||
317                 (groupId != parentFolder.getGroupId())) {
318 
319                 parentFolderId = IGFolderImpl.DEFAULT_PARENT_FOLDER_ID;
320             }
321         }
322 
323         return parentFolderId;
324     }
325 
326     protected long getParentFolderId(IGFolder folder, long parentFolderId)
327         throws SystemException {
328 
329         if (parentFolderId == IGFolderImpl.DEFAULT_PARENT_FOLDER_ID) {
330             return parentFolderId;
331         }
332 
333         if (folder.getFolderId() == parentFolderId) {
334             return folder.getParentFolderId();
335         }
336         else {
337             IGFolder parentFolder =
338                 IGFolderUtil.fetchByPrimaryKey(parentFolderId);
339 
340             if ((parentFolder == null) ||
341                 (folder.getGroupId() != parentFolder.getGroupId())) {
342 
343                 return folder.getParentFolderId();
344             }
345 
346             List subfolderIds = new ArrayList();
347 
348             getSubfolderIds(
349                 subfolderIds, folder.getGroupId(), folder.getFolderId());
350 
351             if (subfolderIds.contains(new Long(parentFolderId))) {
352                 return folder.getParentFolderId();
353             }
354 
355             return parentFolderId;
356         }
357     }
358 
359     protected void mergeFolders(IGFolder fromFolder, long toFolderId)
360         throws PortalException, SystemException {
361 
362         Iterator itr = IGFolderUtil.findByG_P(
363             fromFolder.getGroupId(), fromFolder.getFolderId()).iterator();
364 
365         while (itr.hasNext()) {
366             IGFolder folder = (IGFolder)itr.next();
367 
368             mergeFolders(folder, toFolderId);
369         }
370 
371         itr = IGImageUtil.findByFolderId(fromFolder.getFolderId()).iterator();
372 
373         while (itr.hasNext()) {
374 
375             // Image
376 
377             IGImage image = (IGImage)itr.next();
378 
379             image.setFolderId(toFolderId);
380 
381             IGImageUtil.update(image);
382         }
383 
384         IGFolderUtil.remove(fromFolder.getFolderId());
385     }
386 
387     protected void validate(String name) throws PortalException {
388         if ((Validator.isNull(name)) || (name.indexOf("\\\\") != -1) ||
389             (name.indexOf("//") != -1)) {
390 
391             throw new FolderNameException();
392         }
393     }
394 
395 }