1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   * 
13   */
14  
15  package com.liferay.portlet.imagegallery.service.impl;
16  
17  import com.liferay.portal.PortalException;
18  import com.liferay.portal.SystemException;
19  import com.liferay.portal.kernel.log.Log;
20  import com.liferay.portal.kernel.log.LogFactoryUtil;
21  import com.liferay.portal.kernel.util.FileUtil;
22  import com.liferay.portal.kernel.util.ListUtil;
23  import com.liferay.portal.kernel.util.MimeTypesUtil;
24  import com.liferay.portal.model.Image;
25  import com.liferay.portal.security.permission.ActionKeys;
26  import com.liferay.portlet.imagegallery.model.IGFolder;
27  import com.liferay.portlet.imagegallery.model.IGImage;
28  import com.liferay.portlet.imagegallery.service.base.IGFolderServiceBaseImpl;
29  import com.liferay.portlet.imagegallery.service.permission.IGFolderPermission;
30  
31  import java.io.File;
32  
33  import java.rmi.RemoteException;
34  
35  import java.util.Iterator;
36  import java.util.List;
37  
38  /**
39   * <a href="IGFolderServiceImpl.java.html"><b><i>View Source</i></b></a>
40   *
41   * @author Brian Wing Shun Chan
42   */
43  public class IGFolderServiceImpl extends IGFolderServiceBaseImpl {
44  
45      public IGFolder addFolder(
46              long plid, long parentFolderId, String name, String description,
47              boolean addCommunityPermissions, boolean addGuestPermissions)
48          throws PortalException, SystemException {
49  
50          IGFolderPermission.check(
51              getPermissionChecker(), plid, parentFolderId,
52              ActionKeys.ADD_FOLDER);
53  
54          return igFolderLocalService.addFolder(
55              getUserId(), plid, parentFolderId, name, description,
56              addCommunityPermissions, addGuestPermissions);
57      }
58  
59      public IGFolder addFolder(
60              long plid, long parentFolderId, String name, String description,
61              String[] communityPermissions, String[] guestPermissions)
62          throws PortalException, SystemException {
63  
64          IGFolderPermission.check(
65              getPermissionChecker(), plid, parentFolderId,
66              ActionKeys.ADD_FOLDER);
67  
68          return igFolderLocalService.addFolder(
69              getUserId(), plid, parentFolderId, name, description,
70              communityPermissions, guestPermissions);
71      }
72  
73      public IGFolder copyFolder(
74              long plid, long sourceFolderId, long parentFolderId, String name,
75              String description, boolean addCommunityPermissions,
76              boolean addGuestPermissions)
77          throws PortalException, RemoteException, SystemException {
78  
79          IGFolder srcFolder = getFolder(sourceFolderId);
80  
81          IGFolder destFolder = addFolder(
82              plid, parentFolderId, name, description, addCommunityPermissions,
83              addGuestPermissions);
84  
85          copyFolder(
86              srcFolder, destFolder, addCommunityPermissions,
87              addGuestPermissions);
88  
89          return destFolder;
90      }
91  
92      public void deleteFolder(long folderId)
93          throws PortalException, SystemException {
94  
95          IGFolderPermission.check(
96              getPermissionChecker(), folderId, ActionKeys.DELETE);
97  
98          igFolderLocalService.deleteFolder(folderId);
99      }
100 
101     public IGFolder getFolder(long folderId)
102         throws PortalException, SystemException {
103 
104         IGFolderPermission.check(
105             getPermissionChecker(), folderId, ActionKeys.VIEW);
106 
107         return igFolderLocalService.getFolder(folderId);
108     }
109 
110     public IGFolder getFolder(long groupId, long parentFolderId, String name)
111         throws PortalException, SystemException {
112 
113         IGFolder folder = igFolderLocalService.getFolder(
114             groupId, parentFolderId, name);
115 
116         IGFolderPermission.check(
117             getPermissionChecker(), folder.getFolderId(), ActionKeys.VIEW);
118 
119         return folder;
120     }
121 
122     public List<IGFolder> getFolders(long groupId, long parentFolderId)
123         throws PortalException, SystemException {
124 
125         List<IGFolder> folders = igFolderLocalService.getFolders(
126             groupId, parentFolderId);
127 
128         folders = ListUtil.copy(folders);
129 
130         Iterator<IGFolder> itr = folders.iterator();
131 
132         while (itr.hasNext()) {
133             IGFolder folder = itr.next();
134 
135             if (!IGFolderPermission.contains(
136                     getPermissionChecker(), folder.getFolderId(),
137                     ActionKeys.VIEW)) {
138 
139                 itr.remove();
140             }
141         }
142 
143         return folders;
144     }
145 
146     public IGFolder updateFolder(
147             long folderId, long parentFolderId, String name, String description,
148             boolean mergeWithParentFolder)
149         throws PortalException, SystemException {
150 
151         IGFolderPermission.check(
152             getPermissionChecker(), folderId, ActionKeys.UPDATE);
153 
154         return igFolderLocalService.updateFolder(
155             folderId, parentFolderId, name, description, mergeWithParentFolder);
156     }
157 
158     protected void copyFolder(
159             IGFolder srcFolder, IGFolder destFolder,
160             boolean addCommunityPermissions, boolean addGuestPermissions)
161         throws PortalException, RemoteException, SystemException {
162 
163         List<IGImage> srcImages = igImageService.getImages(
164             srcFolder.getFolderId());
165 
166         for (IGImage srcImage : srcImages) {
167             String name = srcImage.getName();
168             String description = srcImage.getDescription();
169 
170             File file = null;
171 
172             try {
173                 file = FileUtil.createTempFile(srcImage.getImageType());
174 
175                 Image image = imageLocalService.getImage(
176                     srcImage.getLargeImageId());
177 
178                 byte[] bytes = image.getTextObj();
179 
180                 FileUtil.write(file, bytes);
181             }
182             catch (Exception e) {
183                 _log.error(e, e);
184 
185                 continue;
186             }
187 
188             String contentType = MimeTypesUtil.getContentType(
189                 srcImage.getImageType());
190             String[] tagsEntries = null;
191 
192             igImageService.addImage(
193                 destFolder.getFolderId(), name, description, file, contentType,
194                 tagsEntries, addCommunityPermissions, addGuestPermissions);
195 
196             file.delete();
197         }
198 
199         long destPlid = layoutLocalService.getDefaultPlid(
200             destFolder.getGroupId());
201 
202         List<IGFolder> srcSubfolders = getFolders(
203             srcFolder.getGroupId(), srcFolder.getFolderId());
204 
205         for (IGFolder srcSubfolder : srcSubfolders) {
206             String name = srcSubfolder.getName();
207             String description = srcSubfolder.getDescription();
208 
209             IGFolder destSubfolder = addFolder(
210                 destPlid, destFolder.getFolderId(), name, description,
211                 addCommunityPermissions, addGuestPermissions);
212 
213             copyFolder(
214                 srcSubfolder, destSubfolder, addCommunityPermissions,
215                 addGuestPermissions);
216         }
217     }
218 
219     private static Log _log = LogFactoryUtil.getLog(IGFolderServiceImpl.class);
220 
221 }