001    /**
002     * Copyright (c) 2000-2012 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.portal.editor.fckeditor.receiver.impl;
016    
017    import com.liferay.portal.editor.fckeditor.command.CommandArgument;
018    import com.liferay.portal.editor.fckeditor.exception.FCKException;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.repository.model.FileEntry;
022    import com.liferay.portal.kernel.repository.model.Folder;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.model.Group;
026    import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
027    import com.liferay.portal.security.auth.PrincipalException;
028    import com.liferay.portal.service.ServiceContext;
029    import com.liferay.portal.theme.ThemeDisplay;
030    import com.liferay.portal.util.PortletKeys;
031    import com.liferay.portlet.documentlibrary.model.DLFolder;
032    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
033    import com.liferay.portlet.documentlibrary.model.impl.DLFolderImpl;
034    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
035    import com.liferay.portlet.documentlibrary.util.DLUtil;
036    
037    import java.io.InputStream;
038    
039    import java.util.List;
040    import java.util.StringTokenizer;
041    
042    import org.w3c.dom.Document;
043    import org.w3c.dom.Element;
044    import org.w3c.dom.Node;
045    
046    /**
047     * @author Ivica Cardic
048     */
049    public class DocumentCommandReceiver extends BaseCommandReceiver {
050    
051            @Override
052            protected String createFolder(CommandArgument commandArgument) {
053                    try {
054                            Group group = commandArgument.getCurrentGroup();
055    
056                            Folder folder = _getFolder(
057                                    group.getGroupId(),
058                                    StringPool.SLASH + commandArgument.getCurrentFolder());
059    
060                            long repositoryId = folder.getRepositoryId();
061                            long parentFolderId = folder.getFolderId();
062                            String name = commandArgument.getNewFolder();
063                            String description = StringPool.BLANK;
064    
065                            ServiceContext serviceContext = new ServiceContext();
066    
067                            serviceContext.setAddGroupPermissions(true);
068                            serviceContext.setAddGuestPermissions(true);
069    
070                            DLAppServiceUtil.addFolder(
071                                    repositoryId, parentFolderId, name, description,
072                                    serviceContext);
073                    }
074                    catch (Exception e) {
075                            throw new FCKException(e);
076                    }
077    
078                    return "0";
079            }
080    
081            @Override
082            protected String fileUpload(
083                    CommandArgument commandArgument, String fileName,
084                    InputStream inputStream, String contentType, long size) {
085    
086                    try {
087                            Group group = commandArgument.getCurrentGroup();
088    
089                            Folder folder = _getFolder(
090                                    group.getGroupId(), commandArgument.getCurrentFolder());
091    
092                            long repositoryId = folder.getRepositoryId();
093                            long folderId = folder.getFolderId();
094                            String title = fileName;
095                            String description = StringPool.BLANK;
096                            String changeLog = StringPool.BLANK;
097    
098                            ServiceContext serviceContext = new ServiceContext();
099    
100                            serviceContext.setAddGroupPermissions(true);
101                            serviceContext.setAddGuestPermissions(true);
102    
103                            DLAppServiceUtil.addFileEntry(
104                                    repositoryId, folderId, title, contentType, title, description,
105                                    changeLog, inputStream, size, serviceContext);
106                    }
107                    catch (Exception e) {
108                            throw new FCKException(e);
109                    }
110    
111                    return "0";
112            }
113    
114            @Override
115            protected void getFolders(
116                    CommandArgument commandArgument, Document document, Node rootNode) {
117    
118                    try {
119                            _getFolders(commandArgument, document, rootNode);
120                    }
121                    catch (Exception e) {
122                            throw new FCKException(e);
123                    }
124            }
125    
126            @Override
127            protected void getFoldersAndFiles(
128                    CommandArgument commandArgument, Document document, Node rootNode) {
129    
130                    try {
131                            _getFolders(commandArgument, document, rootNode);
132                            _getFiles(commandArgument, document, rootNode);
133                    }
134                    catch (PrincipalException pe) {
135                            if (_log.isWarnEnabled()) {
136                                    _log.warn(pe, pe);
137                            }
138                    }
139                    catch (Exception e) {
140                            throw new FCKException(e);
141                    }
142            }
143    
144            @Override
145            protected boolean isStagedData(Group group) {
146                    return group.isStagedPortlet(PortletKeys.DOCUMENT_LIBRARY);
147            }
148    
149            private void _getFiles(
150                            CommandArgument commandArgument, Document document, Node rootNode)
151                    throws Exception {
152    
153                    Element filesElement = document.createElement("Files");
154    
155                    rootNode.appendChild(filesElement);
156    
157                    if (Validator.isNull(commandArgument.getCurrentGroupName())) {
158                            return;
159                    }
160    
161                    Group group = commandArgument.getCurrentGroup();
162    
163                    Folder folder = _getFolder(
164                            group.getGroupId(), commandArgument.getCurrentFolder());
165    
166                    List<FileEntry> fileEntries = DLAppServiceUtil.getFileEntries(
167                            folder.getRepositoryId(), folder.getFolderId());
168    
169                    for (FileEntry fileEntry : fileEntries) {
170                            Element fileElement = document.createElement("File");
171    
172                            filesElement.appendChild(fileElement);
173    
174                            fileElement.setAttribute("name", fileEntry.getTitle());
175                            fileElement.setAttribute("desc", fileEntry.getTitle());
176                            fileElement.setAttribute("size", getSize(fileEntry.getSize()));
177    
178                            ThemeDisplay themeDisplay = commandArgument.getThemeDisplay();
179    
180                            String url = DLUtil.getPreviewURL(
181                                    fileEntry, fileEntry.getFileVersion(), themeDisplay,
182                                    StringPool.BLANK, false, false);
183    
184                            fileElement.setAttribute("url", url);
185                    }
186            }
187    
188            private Folder _getFolder(long groupId, String folderName)
189                    throws Exception {
190    
191                    DLFolder dlFolder = new DLFolderImpl();
192    
193                    dlFolder.setFolderId(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
194                    dlFolder.setGroupId(groupId);
195                    dlFolder.setRepositoryId(groupId);
196    
197                    Folder folder = new LiferayFolder(dlFolder);
198    
199                    if (folderName.equals(StringPool.SLASH)) {
200                            return folder;
201                    }
202    
203                    StringTokenizer st = new StringTokenizer(folderName, StringPool.SLASH);
204    
205                    while (st.hasMoreTokens()) {
206                            String curFolderName = st.nextToken();
207    
208                            List<Folder> folders = DLAppServiceUtil.getFolders(
209                                    folder.getRepositoryId(), folder.getFolderId());
210    
211                            for (Folder curFolder : folders) {
212                                    if (curFolder.getName().equals(curFolderName)) {
213                                            folder = curFolder;
214    
215                                            break;
216                                    }
217                            }
218                    }
219    
220                    return folder;
221            }
222    
223            private void _getFolders(
224                            CommandArgument commandArgument, Document document, Node rootNode)
225                    throws Exception {
226    
227                    Element foldersElement = document.createElement("Folders");
228    
229                    rootNode.appendChild(foldersElement);
230    
231                    if (commandArgument.getCurrentFolder().equals(StringPool.SLASH)) {
232                            getRootFolders(commandArgument, document, foldersElement);
233                    }
234                    else {
235                            Group group = commandArgument.getCurrentGroup();
236    
237                            Folder folder = _getFolder(
238                                    group.getGroupId(), commandArgument.getCurrentFolder());
239    
240                            List<Folder> folders = DLAppServiceUtil.getFolders(
241                                    folder.getRepositoryId(), folder.getFolderId());
242    
243                            for (Folder curFolder : folders) {
244                                    Element folderElement = document.createElement("Folder");
245    
246                                    foldersElement.appendChild(folderElement);
247    
248                                    folderElement.setAttribute("name", curFolder.getName());
249                            }
250                    }
251            }
252    
253            private static Log _log = LogFactoryUtil.getLog(
254                    DocumentCommandReceiver.class);
255    
256    }