001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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.dao.orm.QueryUtil;
020    import com.liferay.portal.kernel.log.Log;
021    import com.liferay.portal.kernel.log.LogFactoryUtil;
022    import com.liferay.portal.kernel.repository.model.FileEntry;
023    import com.liferay.portal.kernel.repository.model.Folder;
024    import com.liferay.portal.kernel.util.OrderByComparator;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.model.Group;
028    import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
029    import com.liferay.portal.security.auth.PrincipalException;
030    import com.liferay.portal.service.ServiceContext;
031    import com.liferay.portal.util.PortletKeys;
032    import com.liferay.portlet.documentlibrary.model.DLFolder;
033    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
034    import com.liferay.portlet.documentlibrary.model.impl.DLFolderImpl;
035    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
036    import com.liferay.portlet.documentlibrary.util.DLUtil;
037    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelModifiedDateComparator;
038    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelNameComparator;
039    import com.liferay.portlet.documentlibrary.util.comparator.RepositoryModelSizeComparator;
040    
041    import java.io.InputStream;
042    
043    import java.util.ArrayList;
044    import java.util.Collections;
045    import java.util.List;
046    import java.util.StringTokenizer;
047    
048    import org.w3c.dom.Document;
049    import org.w3c.dom.Element;
050    import org.w3c.dom.Node;
051    
052    /**
053     * @author Ivica Cardic
054     */
055    public class DocumentCommandReceiver extends BaseCommandReceiver {
056    
057            @Override
058            protected String createFolder(CommandArgument commandArgument) {
059                    try {
060                            Group group = commandArgument.getCurrentGroup();
061    
062                            Folder folder = _getFolder(
063                                    group.getGroupId(),
064                                    StringPool.SLASH + commandArgument.getCurrentFolder());
065    
066                            long repositoryId = folder.getRepositoryId();
067                            long parentFolderId = folder.getFolderId();
068                            String name = commandArgument.getNewFolder();
069                            String description = StringPool.BLANK;
070    
071                            ServiceContext serviceContext = new ServiceContext();
072    
073                            serviceContext.setAddGroupPermissions(true);
074                            serviceContext.setAddGuestPermissions(true);
075    
076                            DLAppServiceUtil.addFolder(
077                                    repositoryId, parentFolderId, name, description,
078                                    serviceContext);
079                    }
080                    catch (Exception e) {
081                            throw new FCKException(e);
082                    }
083    
084                    return "0";
085            }
086    
087            @Override
088            protected String fileUpload(
089                    CommandArgument commandArgument, String fileName,
090                    InputStream inputStream, String contentType, long size) {
091    
092                    try {
093                            Group group = commandArgument.getCurrentGroup();
094    
095                            Folder folder = _getFolder(
096                                    group.getGroupId(), commandArgument.getCurrentFolder());
097    
098                            long repositoryId = folder.getRepositoryId();
099                            long folderId = folder.getFolderId();
100                            String title = fileName;
101                            String description = StringPool.BLANK;
102                            String changeLog = StringPool.BLANK;
103    
104                            ServiceContext serviceContext = new ServiceContext();
105    
106                            serviceContext.setAddGroupPermissions(true);
107                            serviceContext.setAddGuestPermissions(true);
108    
109                            DLAppServiceUtil.addFileEntry(
110                                    repositoryId, folderId, title, contentType, title, description,
111                                    changeLog, inputStream, size, serviceContext);
112                    }
113                    catch (Exception e) {
114                            throw new FCKException(e);
115                    }
116    
117                    return "0";
118            }
119    
120            protected Element getFileElement(
121                            CommandArgument commandArgument, Element fileElement,
122                            FileEntry fileEntry)
123                    throws Exception {
124    
125                    String name = fileEntry.getTitle();
126    
127                    String extension = fileEntry.getExtension();
128    
129                    if (Validator.isNotNull(extension)) {
130                            String periodAndExtension = StringPool.PERIOD.concat(extension);
131    
132                            if (!name.endsWith(periodAndExtension)) {
133                                    name = name.concat(periodAndExtension);
134                            }
135                    }
136    
137                    fileElement.setAttribute("name", name);
138    
139                    String description = fileEntry.getDescription();
140    
141                    fileElement.setAttribute(
142                            "desc", Validator.isNotNull(description) ? description : name);
143    
144                    fileElement.setAttribute("size", getSize(fileEntry.getSize()));
145    
146                    String url = DLUtil.getPreviewURL(
147                            fileEntry, fileEntry.getFileVersion(),
148                            commandArgument.getThemeDisplay(), StringPool.BLANK, false, false);
149    
150                    fileElement.setAttribute("url", url);
151    
152                    return fileElement;
153            }
154    
155            protected List<Element> getFileElements(
156                            CommandArgument commandArgument, Document document, Folder folder)
157                    throws Exception {
158    
159                    List<FileEntry> fileEntries = Collections.<FileEntry>emptyList();
160    
161                    String sortType = commandArgument.getSortType();
162    
163                    if (Validator.isNotNull(sortType)) {
164                            boolean ascending = commandArgument.getAscending();
165    
166                            OrderByComparator obc = null;
167    
168                            if (sortType.equals("Modified Date")) {
169                                    obc = new RepositoryModelModifiedDateComparator(ascending);
170                            }
171                            else if (sortType.equals("Size")) {
172                                    obc = new RepositoryModelSizeComparator(ascending);
173                            }
174                            else if (sortType.equals("Title")) {
175                                    obc = new RepositoryModelNameComparator(ascending);
176                            }
177    
178                            fileEntries = DLAppServiceUtil.getFileEntries(
179                                    folder.getRepositoryId(), folder.getFolderId(),
180                                    QueryUtil.ALL_POS, QueryUtil.ALL_POS, obc);
181                    }
182                    else {
183                            fileEntries = DLAppServiceUtil.getFileEntries(
184                                    folder.getRepositoryId(), folder.getFolderId());
185                    }
186    
187                    List<Element> fileElements = new ArrayList<Element>(fileEntries.size());
188    
189                    for (FileEntry fileEntry : fileEntries) {
190                            Element fileElement = document.createElement("File");
191    
192                            fileElement = getFileElement(
193                                    commandArgument, fileElement, fileEntry);
194    
195                            fileElements.add(fileElement);
196                    }
197    
198                    return fileElements;
199            }
200    
201            @Override
202            protected void getFolders(
203                    CommandArgument commandArgument, Document document, Node rootNode) {
204    
205                    try {
206                            _getFolders(commandArgument, document, rootNode);
207                    }
208                    catch (Exception e) {
209                            throw new FCKException(e);
210                    }
211            }
212    
213            @Override
214            protected void getFoldersAndFiles(
215                    CommandArgument commandArgument, Document document, Node rootNode) {
216    
217                    try {
218                            _getFolders(commandArgument, document, rootNode);
219                            _getFiles(commandArgument, document, rootNode);
220                    }
221                    catch (PrincipalException pe) {
222                            if (_log.isWarnEnabled()) {
223                                    _log.warn(pe, pe);
224                            }
225                    }
226                    catch (Exception e) {
227                            throw new FCKException(e);
228                    }
229            }
230    
231            @Override
232            protected boolean isStagedData(Group group) {
233                    return group.isStagedPortlet(PortletKeys.DOCUMENT_LIBRARY);
234            }
235    
236            private void _getFiles(
237                            CommandArgument commandArgument, Document document, Node rootNode)
238                    throws Exception {
239    
240                    Element filesElement = document.createElement("Files");
241    
242                    rootNode.appendChild(filesElement);
243    
244                    if (Validator.isNull(commandArgument.getCurrentGroupName())) {
245                            return;
246                    }
247    
248                    Group group = commandArgument.getCurrentGroup();
249    
250                    Folder folder = _getFolder(
251                            group.getGroupId(), commandArgument.getCurrentFolder());
252    
253                    List<Element> fileElements = getFileElements(
254                            commandArgument, document, folder);
255    
256                    for (Element fileElement : fileElements) {
257                            filesElement.appendChild(fileElement);
258                    }
259            }
260    
261            private Folder _getFolder(long groupId, String folderName)
262                    throws Exception {
263    
264                    DLFolder dlFolder = new DLFolderImpl();
265    
266                    dlFolder.setFolderId(DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
267                    dlFolder.setGroupId(groupId);
268                    dlFolder.setRepositoryId(groupId);
269    
270                    Folder folder = new LiferayFolder(dlFolder);
271    
272                    if (folderName.equals(StringPool.SLASH)) {
273                            return folder;
274                    }
275    
276                    StringTokenizer st = new StringTokenizer(folderName, StringPool.SLASH);
277    
278                    while (st.hasMoreTokens()) {
279                            String curFolderName = st.nextToken();
280    
281                            List<Folder> folders = DLAppServiceUtil.getFolders(
282                                    folder.getRepositoryId(), folder.getFolderId());
283    
284                            for (Folder curFolder : folders) {
285                                    if (curFolder.getName().equals(curFolderName)) {
286                                            folder = curFolder;
287    
288                                            break;
289                                    }
290                            }
291                    }
292    
293                    return folder;
294            }
295    
296            private void _getFolders(
297                            CommandArgument commandArgument, Document document, Node rootNode)
298                    throws Exception {
299    
300                    Element foldersElement = document.createElement("Folders");
301    
302                    rootNode.appendChild(foldersElement);
303    
304                    if (commandArgument.getCurrentFolder().equals(StringPool.SLASH)) {
305                            getRootFolders(commandArgument, document, foldersElement);
306                    }
307                    else {
308                            Group group = commandArgument.getCurrentGroup();
309    
310                            Folder folder = _getFolder(
311                                    group.getGroupId(), commandArgument.getCurrentFolder());
312    
313                            List<Folder> folders = DLAppServiceUtil.getFolders(
314                                    folder.getRepositoryId(), folder.getFolderId());
315    
316                            for (Folder curFolder : folders) {
317                                    Element folderElement = document.createElement("Folder");
318    
319                                    foldersElement.appendChild(folderElement);
320    
321                                    folderElement.setAttribute("name", curFolder.getName());
322                            }
323                    }
324            }
325    
326            private static Log _log = LogFactoryUtil.getLog(
327                    DocumentCommandReceiver.class);
328    
329    }