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.NoSuchLayoutException;
018    import com.liferay.portal.editor.fckeditor.command.CommandArgument;
019    import com.liferay.portal.editor.fckeditor.exception.FCKException;
020    import com.liferay.portal.kernel.exception.PortalException;
021    import com.liferay.portal.kernel.exception.SystemException;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.model.Group;
024    import com.liferay.portal.model.Layout;
025    import com.liferay.portal.model.LayoutConstants;
026    import com.liferay.portal.service.LayoutLocalServiceUtil;
027    import com.liferay.portal.service.LayoutServiceUtil;
028    import com.liferay.portal.theme.ThemeDisplay;
029    import com.liferay.portal.util.PortalUtil;
030    
031    import java.io.InputStream;
032    
033    import java.util.ArrayList;
034    import java.util.List;
035    
036    import org.w3c.dom.Document;
037    import org.w3c.dom.Element;
038    import org.w3c.dom.Node;
039    
040    /**
041     * @author Ivica Cardic
042     */
043    public class PageCommandReceiver extends BaseCommandReceiver {
044    
045            @Override
046            protected String createFolder(CommandArgument commandArgument) {
047                    return "0";
048            }
049    
050            @Override
051            protected String fileUpload(
052                    CommandArgument commandArgument, String fileName,
053                    InputStream inputStream, String extension, long size) {
054    
055                    return "0";
056            }
057    
058            @Override
059            protected void getFolders(
060                    CommandArgument commandArgument, Document document, Node rootNode) {
061    
062                    try {
063                            _getFolders(commandArgument, document, rootNode);
064                    }
065                    catch (Exception e) {
066                            throw new FCKException(e);
067                    }
068            }
069    
070            @Override
071            protected void getFoldersAndFiles(
072                    CommandArgument commandArgument, Document document, Node rootNode) {
073    
074                    try {
075                            _getFolders(commandArgument, document, rootNode);
076                            _getFiles(commandArgument, document, rootNode);
077                    }
078                    catch (Exception e) {
079                            throw new FCKException(e);
080                    }
081            }
082    
083            private void _getFiles(
084                            CommandArgument commandArgument, Document document, Node rootNode)
085                    throws Exception {
086    
087                    if (commandArgument.getCurrentFolder().equals(StringPool.SLASH)) {
088                            return;
089                    }
090    
091                    Element filesElement = document.createElement("Files");
092    
093                    rootNode.appendChild(filesElement);
094    
095                    Group group = commandArgument.getCurrentGroup();
096    
097                    List<Layout> layouts = new ArrayList<Layout>();
098    
099                    layouts.addAll(
100                            LayoutServiceUtil.getLayouts(
101                                    group.getGroupId(), false,
102                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID));
103    
104                    layouts.addAll(
105                            LayoutServiceUtil.getLayouts(
106                                    group.getGroupId(), true,
107                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID));
108    
109                    if (("/" + commandArgument.getCurrentGroupName() + "/").equals(
110                                    commandArgument.getCurrentFolder())) {
111    
112                            for (Layout layout : layouts) {
113                                    Element fileElement = document.createElement("File");
114    
115                                    filesElement.appendChild(fileElement);
116    
117                                    fileElement.setAttribute("name", _getLayoutName(layout));
118                                    fileElement.setAttribute("desc", _getLayoutName(layout));
119                                    fileElement.setAttribute("size", StringPool.BLANK);
120                                    fileElement.setAttribute(
121                                            "url",
122                                            _getRelativeURL(layout, commandArgument.getThemeDisplay()));
123                            }
124                    }
125                    else {
126                            String layoutName = _getLayoutName(
127                                    commandArgument.getCurrentFolder());
128    
129                            Layout layout = _getLayout(group.getGroupId(), layoutName);
130    
131                            if (layout == null) {
132                                    return;
133                            }
134    
135                            List<Layout> layoutChildren = layout.getChildren();
136    
137                            for (int i = 0; i < layoutChildren.size(); i++) {
138                                    layout = layoutChildren.get(i);
139    
140                                    Element fileElement = document.createElement("File");
141    
142                                    filesElement.appendChild(fileElement);
143    
144                                    fileElement.setAttribute("name", _getLayoutName(layout));
145                                    fileElement.setAttribute("desc", _getLayoutName(layout));
146                                    fileElement.setAttribute("size", getSize());
147                                    fileElement.setAttribute(
148                                            "url",
149                                            _getRelativeURL(layout, commandArgument.getThemeDisplay()));
150                            }
151                    }
152            }
153    
154            private void _getFolders(
155                            CommandArgument commandArgument, Document document, Node rootNode)
156                    throws Exception {
157    
158                    Element foldersElement = document.createElement("Folders");
159    
160                    rootNode.appendChild(foldersElement);
161    
162                    if (commandArgument.getCurrentFolder().equals(StringPool.SLASH)) {
163                            getRootFolders(commandArgument, document, foldersElement);
164                    }
165                    else {
166                            Group group = commandArgument.getCurrentGroup();
167    
168                            List<Layout> layouts = new ArrayList<Layout>();
169    
170                            layouts.addAll(
171                                    LayoutServiceUtil.getLayouts(
172                                            group.getGroupId(), false,
173                                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID));
174    
175                            layouts.addAll(
176                                    LayoutServiceUtil.getLayouts(
177                                            group.getGroupId(), true,
178                                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID));
179    
180                            if (("/" + commandArgument.getCurrentGroupName() + "/").equals(
181                                            commandArgument.getCurrentFolder())) {
182    
183                                    for (Layout layout : layouts) {
184                                            Element folderElement = document.createElement("Folder");
185    
186                                            foldersElement.appendChild(folderElement);
187    
188                                            folderElement.setAttribute(
189                                                    "name", "~" + _getLayoutName(layout).replace('/', '>'));
190                                    }
191                            }
192                            else {
193                                    String layoutName = _getLayoutName(
194                                            commandArgument.getCurrentFolder());
195    
196                                    Layout layout = _getLayout(group.getGroupId(), layoutName);
197    
198                                    if (layout != null) {
199                                            List<Layout> layoutChildren = layout.getChildren();
200    
201                                            for (int i = 0; i < layoutChildren.size(); i++) {
202                                                    layout = layoutChildren.get(i);
203    
204                                                    Element folderElement = document.createElement(
205                                                            "Folder");
206    
207                                                    foldersElement.appendChild(folderElement);
208    
209                                                    folderElement.setAttribute(
210                                                            "name",
211                                                            "~" + _getLayoutName(layout).replace('/', '>'));
212                                            }
213                                    }
214                            }
215                    }
216            }
217    
218            private Layout _getLayout(long groupId, String layoutName)
219                    throws Exception {
220    
221                    Layout layout = null;
222    
223                    try {
224                            layout = LayoutLocalServiceUtil.getFriendlyURLLayout(
225                                    groupId, false, layoutName);
226    
227                            return layout;
228                    }
229                    catch (NoSuchLayoutException nsle) {
230                    }
231    
232                    try {
233                            layout = LayoutLocalServiceUtil.getFriendlyURLLayout(
234                                    groupId, true, layoutName);
235    
236                            return layout;
237                    }
238                    catch (NoSuchLayoutException nsle) {
239                    }
240    
241                    return null;
242            }
243    
244            private String _getLayoutName(Layout layout) {
245                    return layout.getFriendlyURL();
246            }
247    
248            private String _getLayoutName(String folderName) {
249                    String layoutName = folderName.substring(
250                            folderName.lastIndexOf('~') + 1, folderName.length() - 1);
251    
252                    layoutName = layoutName.replace('>', '/');
253    
254                    return layoutName;
255            }
256    
257            private String _getRelativeURL(Layout layout, ThemeDisplay themeDisplay)
258                    throws PortalException, SystemException {
259    
260                    String layoutFullURL = PortalUtil.getLayoutFullURL(
261                            layout, themeDisplay, false);
262    
263                    String canonicalURL = PortalUtil.getCanonicalURL(
264                            layoutFullURL, themeDisplay, layout, true);
265    
266                    String portalURL = themeDisplay.getPortalURL();
267    
268                    if (canonicalURL.startsWith(portalURL)) {
269                            return canonicalURL.substring(portalURL.length());
270                    }
271    
272                    return canonicalURL;
273            }
274    
275    }