001    /**
002     * Copyright (c) 2000-2010 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.imagegallery.service.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.util.FileUtil;
022    import com.liferay.portal.kernel.util.ListUtil;
023    import com.liferay.portal.kernel.util.MimeTypesUtil;
024    import com.liferay.portal.model.Image;
025    import com.liferay.portal.security.permission.ActionKeys;
026    import com.liferay.portal.service.ServiceContext;
027    import com.liferay.portlet.imagegallery.model.IGFolder;
028    import com.liferay.portlet.imagegallery.model.IGImage;
029    import com.liferay.portlet.imagegallery.service.base.IGFolderServiceBaseImpl;
030    import com.liferay.portlet.imagegallery.service.permission.IGFolderPermission;
031    
032    import java.io.File;
033    
034    import java.util.Iterator;
035    import java.util.List;
036    
037    /**
038     * @author Brian Wing Shun Chan
039     * @author Jorge Ferrer
040     * @author Alexander Chow
041     */
042    public class IGFolderServiceImpl extends IGFolderServiceBaseImpl {
043    
044            public IGFolder addFolder(
045                            long parentFolderId, String name, String description,
046                            ServiceContext serviceContext)
047                    throws PortalException, SystemException {
048    
049                    IGFolderPermission.check(
050                            getPermissionChecker(), serviceContext.getScopeGroupId(),
051                            parentFolderId, ActionKeys.ADD_FOLDER);
052    
053                    return igFolderLocalService.addFolder(
054                            getUserId(), parentFolderId, name, description, serviceContext);
055            }
056    
057            public IGFolder copyFolder(
058                            long sourceFolderId, long parentFolderId, String name,
059                            String description, ServiceContext serviceContext)
060                    throws PortalException, SystemException {
061    
062                    IGFolder srcFolder = getFolder(sourceFolderId);
063    
064                    IGFolder destFolder = addFolder(
065                            parentFolderId, name, description, serviceContext);
066    
067                    copyFolder(srcFolder, destFolder, serviceContext);
068    
069                    return destFolder;
070            }
071    
072            public void deleteFolder(long folderId)
073                    throws PortalException, SystemException {
074    
075                    IGFolder folder = igFolderLocalService.getFolder(folderId);
076    
077                    IGFolderPermission.check(
078                            getPermissionChecker(), folder, ActionKeys.DELETE);
079    
080                    igFolderLocalService.deleteFolder(folderId);
081            }
082    
083            public IGFolder getFolder(long folderId)
084                    throws PortalException, SystemException {
085    
086                    IGFolder folder = igFolderLocalService.getFolder(folderId);
087    
088                    IGFolderPermission.check(
089                            getPermissionChecker(), folder, ActionKeys.VIEW);
090    
091                    return folder;
092            }
093    
094            public IGFolder getFolder(long groupId, long parentFolderId, String name)
095                    throws PortalException, SystemException {
096    
097                    IGFolder folder = igFolderLocalService.getFolder(
098                            groupId, parentFolderId, name);
099    
100                    IGFolderPermission.check(
101                            getPermissionChecker(), folder, ActionKeys.VIEW);
102    
103                    return folder;
104            }
105    
106            public List<IGFolder> getFolders(long groupId, long parentFolderId)
107                    throws PortalException, SystemException {
108    
109                    List<IGFolder> folders = igFolderLocalService.getFolders(
110                            groupId, parentFolderId);
111    
112                    folders = ListUtil.copy(folders);
113    
114                    Iterator<IGFolder> itr = folders.iterator();
115    
116                    while (itr.hasNext()) {
117                            IGFolder folder = itr.next();
118    
119                            if (!IGFolderPermission.contains(
120                                            getPermissionChecker(), folder, ActionKeys.VIEW)) {
121    
122                                    itr.remove();
123                            }
124                    }
125    
126                    return folders;
127            }
128    
129            public IGFolder updateFolder(
130                            long folderId, long parentFolderId, String name, String description,
131                            boolean mergeWithParentFolder, ServiceContext serviceContext)
132                    throws PortalException, SystemException {
133    
134                    IGFolder folder = igFolderLocalService.getFolder(folderId);
135    
136                    IGFolderPermission.check(
137                            getPermissionChecker(), folder, ActionKeys.UPDATE);
138    
139                    return igFolderLocalService.updateFolder(
140                            folderId, parentFolderId, name, description, mergeWithParentFolder,
141                            serviceContext);
142            }
143    
144            protected void copyFolder(
145                            IGFolder srcFolder, IGFolder destFolder,
146                            ServiceContext serviceContext)
147                    throws PortalException, SystemException {
148    
149                    List<IGImage> srcImages = igImageService.getImages(
150                            srcFolder.getGroupId(), srcFolder.getFolderId());
151    
152                    for (IGImage srcImage : srcImages) {
153                            String name = srcImage.getName();
154                            String description = srcImage.getDescription();
155    
156                            File file = null;
157    
158                            try {
159                                    file = FileUtil.createTempFile(srcImage.getImageType());
160    
161                                    Image image = imageLocalService.getImage(
162                                            srcImage.getLargeImageId());
163    
164                                    byte[] bytes = image.getTextObj();
165    
166                                    FileUtil.write(file, bytes);
167                            }
168                            catch (Exception e) {
169                                    _log.error(e, e);
170    
171                                    continue;
172                            }
173    
174                            String contentType = MimeTypesUtil.getContentType(
175                                    srcImage.getImageType());
176    
177                            igImageService.addImage(
178                                    destFolder.getGroupId(), destFolder.getFolderId(), name,
179                                    description, file, contentType, serviceContext);
180    
181                            file.delete();
182                    }
183    
184                    List<IGFolder> srcSubfolders = getFolders(
185                            srcFolder.getGroupId(), srcFolder.getFolderId());
186    
187                    for (IGFolder srcSubfolder : srcSubfolders) {
188                            String name = srcSubfolder.getName();
189                            String description = srcSubfolder.getDescription();
190    
191                            serviceContext.setScopeGroupId(srcFolder.getGroupId());
192    
193                            IGFolder destSubfolder = addFolder(
194                                    destFolder.getFolderId(), name, description, serviceContext);
195    
196                            copyFolder(srcSubfolder, destSubfolder, serviceContext);
197                    }
198            }
199    
200            private static Log _log = LogFactoryUtil.getLog(IGFolderServiceImpl.class);
201    
202    }