001    /**
002     * Copyright (c) 2000-2013 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                            String name = fileEntry.getTitle();
175    
176                            String extension = fileEntry.getExtension();
177    
178                            if (Validator.isNotNull(extension)) {
179                                    String periodAndExtension = StringPool.PERIOD.concat(extension);
180    
181                                    if (!name.endsWith(periodAndExtension)) {
182                                            name = name.concat(periodAndExtension);
183                                    }
184                            }
185    
186                            fileElement.setAttribute("name", name);
187                            fileElement.setAttribute("desc", name);
188    
189                            fileElement.setAttribute("size", getSize(fileEntry.getSize()));
190    
191                            ThemeDisplay themeDisplay = commandArgument.getThemeDisplay();
192    
193                            String url = DLUtil.getPreviewURL(
194                                    fileEntry, fileEntry.getFileVersion(), themeDisplay,
195                                    StringPool.BLANK, false, false);
196    
197                            fileElement.setAttribute("url", url);
198                    }
199            }
200    
201            private Folder _getFolder(long groupId, String folderName)
202                    throws Exception {
203    
204                    DLFolder dlFolder = new DLFolderImpl();
205    
206                    dlFolder.setFolderId(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
207                    dlFolder.setGroupId(groupId);
208                    dlFolder.setRepositoryId(groupId);
209    
210                    Folder folder = new LiferayFolder(dlFolder);
211    
212                    if (folderName.equals(StringPool.SLASH)) {
213                            return folder;
214                    }
215    
216                    StringTokenizer st = new StringTokenizer(folderName, StringPool.SLASH);
217    
218                    while (st.hasMoreTokens()) {
219                            String curFolderName = st.nextToken();
220    
221                            List<Folder> folders = DLAppServiceUtil.getFolders(
222                                    folder.getRepositoryId(), folder.getFolderId());
223    
224                            for (Folder curFolder : folders) {
225                                    if (curFolder.getName().equals(curFolderName)) {
226                                            folder = curFolder;
227    
228                                            break;
229                                    }
230                            }
231                    }
232    
233                    return folder;
234            }
235    
236            private void _getFolders(
237                            CommandArgument commandArgument, Document document, Node rootNode)
238                    throws Exception {
239    
240                    Element foldersElement = document.createElement("Folders");
241    
242                    rootNode.appendChild(foldersElement);
243    
244                    if (commandArgument.getCurrentFolder().equals(StringPool.SLASH)) {
245                            getRootFolders(commandArgument, document, foldersElement);
246                    }
247                    else {
248                            Group group = commandArgument.getCurrentGroup();
249    
250                            Folder folder = _getFolder(
251                                    group.getGroupId(), commandArgument.getCurrentFolder());
252    
253                            List<Folder> folders = DLAppServiceUtil.getFolders(
254                                    folder.getRepositoryId(), folder.getFolderId());
255    
256                            for (Folder curFolder : folders) {
257                                    Element folderElement = document.createElement("Folder");
258    
259                                    foldersElement.appendChild(folderElement);
260    
261                                    folderElement.setAttribute("name", curFolder.getName());
262                            }
263                    }
264            }
265    
266            private static Log _log = LogFactoryUtil.getLog(
267                    DocumentCommandReceiver.class);
268    
269    }