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.util.PortletKeys;
030    import com.liferay.portlet.documentlibrary.model.DLFolder;
031    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
032    import com.liferay.portlet.documentlibrary.model.impl.DLFolderImpl;
033    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
034    import com.liferay.portlet.documentlibrary.util.DLUtil;
035    
036    import java.io.InputStream;
037    
038    import java.util.ArrayList;
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            protected Element getFileElement(
115                            CommandArgument commandArgument, Element fileElement,
116                            FileEntry fileEntry)
117                    throws Exception {
118    
119                    String name = fileEntry.getTitle();
120    
121                    String extension = fileEntry.getExtension();
122    
123                    if (Validator.isNotNull(extension)) {
124                            String periodAndExtension = StringPool.PERIOD.concat(extension);
125    
126                            if (!name.endsWith(periodAndExtension)) {
127                                    name = name.concat(periodAndExtension);
128                            }
129                    }
130    
131                    fileElement.setAttribute("name", name);
132    
133                    String description = fileEntry.getDescription();
134    
135                    fileElement.setAttribute(
136                            "desc", Validator.isNotNull(description) ? description : name);
137    
138                    fileElement.setAttribute("size", getSize(fileEntry.getSize()));
139    
140                    String url = DLUtil.getPreviewURL(
141                            fileEntry, fileEntry.getFileVersion(),
142                            commandArgument.getThemeDisplay(), StringPool.BLANK, false, false);
143    
144                    fileElement.setAttribute("url", url);
145    
146                    return fileElement;
147            }
148    
149            protected List<Element> getFileElements(
150                            CommandArgument commandArgument, Document document, Folder folder)
151                    throws Exception {
152    
153                    List<FileEntry> fileEntries = DLAppServiceUtil.getFileEntries(
154                            folder.getRepositoryId(), folder.getFolderId());
155    
156                    List<Element> fileElements = new ArrayList<Element>(fileEntries.size());
157    
158                    for (FileEntry fileEntry : fileEntries) {
159                            Element fileElement = document.createElement("File");
160    
161                            fileElement = getFileElement(
162                                    commandArgument, fileElement, fileEntry);
163    
164                            fileElements.add(fileElement);
165                    }
166    
167                    return fileElements;
168            }
169    
170            @Override
171            protected void getFolders(
172                    CommandArgument commandArgument, Document document, Node rootNode) {
173    
174                    try {
175                            _getFolders(commandArgument, document, rootNode);
176                    }
177                    catch (Exception e) {
178                            throw new FCKException(e);
179                    }
180            }
181    
182            @Override
183            protected void getFoldersAndFiles(
184                    CommandArgument commandArgument, Document document, Node rootNode) {
185    
186                    try {
187                            _getFolders(commandArgument, document, rootNode);
188                            _getFiles(commandArgument, document, rootNode);
189                    }
190                    catch (PrincipalException pe) {
191                            if (_log.isWarnEnabled()) {
192                                    _log.warn(pe, pe);
193                            }
194                    }
195                    catch (Exception e) {
196                            throw new FCKException(e);
197                    }
198            }
199    
200            @Override
201            protected boolean isStagedData(Group group) {
202                    return group.isStagedPortlet(PortletKeys.DOCUMENT_LIBRARY);
203            }
204    
205            private void _getFiles(
206                            CommandArgument commandArgument, Document document, Node rootNode)
207                    throws Exception {
208    
209                    Element filesElement = document.createElement("Files");
210    
211                    rootNode.appendChild(filesElement);
212    
213                    if (Validator.isNull(commandArgument.getCurrentGroupName())) {
214                            return;
215                    }
216    
217                    Group group = commandArgument.getCurrentGroup();
218    
219                    Folder folder = _getFolder(
220                            group.getGroupId(), commandArgument.getCurrentFolder());
221    
222                    List<Element> fileElements = getFileElements(
223                            commandArgument, document, folder);
224    
225                    for (Element fileElement : fileElements) {
226                            filesElement.appendChild(fileElement);
227                    }
228            }
229    
230            private Folder _getFolder(long groupId, String folderName)
231                    throws Exception {
232    
233                    DLFolder dlFolder = new DLFolderImpl();
234    
235                    dlFolder.setFolderId(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
236                    dlFolder.setGroupId(groupId);
237                    dlFolder.setRepositoryId(groupId);
238    
239                    Folder folder = new LiferayFolder(dlFolder);
240    
241                    if (folderName.equals(StringPool.SLASH)) {
242                            return folder;
243                    }
244    
245                    StringTokenizer st = new StringTokenizer(folderName, StringPool.SLASH);
246    
247                    while (st.hasMoreTokens()) {
248                            String curFolderName = st.nextToken();
249    
250                            List<Folder> folders = DLAppServiceUtil.getFolders(
251                                    folder.getRepositoryId(), folder.getFolderId());
252    
253                            for (Folder curFolder : folders) {
254                                    if (curFolder.getName().equals(curFolderName)) {
255                                            folder = curFolder;
256    
257                                            break;
258                                    }
259                            }
260                    }
261    
262                    return folder;
263            }
264    
265            private void _getFolders(
266                            CommandArgument commandArgument, Document document, Node rootNode)
267                    throws Exception {
268    
269                    Element foldersElement = document.createElement("Folders");
270    
271                    rootNode.appendChild(foldersElement);
272    
273                    if (commandArgument.getCurrentFolder().equals(StringPool.SLASH)) {
274                            getRootFolders(commandArgument, document, foldersElement);
275                    }
276                    else {
277                            Group group = commandArgument.getCurrentGroup();
278    
279                            Folder folder = _getFolder(
280                                    group.getGroupId(), commandArgument.getCurrentFolder());
281    
282                            List<Folder> folders = DLAppServiceUtil.getFolders(
283                                    folder.getRepositoryId(), folder.getFolderId());
284    
285                            for (Folder curFolder : folders) {
286                                    Element folderElement = document.createElement("Folder");
287    
288                                    foldersElement.appendChild(folderElement);
289    
290                                    folderElement.setAttribute("name", curFolder.getName());
291                            }
292                    }
293            }
294    
295            private static Log _log = LogFactoryUtil.getLog(
296                    DocumentCommandReceiver.class);
297    
298    }