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